diff --git a/.eslintrc.js b/.eslintrc.js index 49ff5c4e3..ba733c944 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -15,7 +15,10 @@ module.exports = { '.browser_modules/*', 'docs/*', 'scripts/*', - 'electron-app/*', + 'electron-app/lib/*', + 'electron-app/src-gen/*', + 'electron-app/gen-webpack*.js', + '!electron-app/webpack.config.js', 'plugins/*', 'arduino-ide-extension/src/node/cli-protocol', ], diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 77c506bff..1c830648d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,9 +1,11 @@ name: Arduino IDE on: + create: push: branches: - main + - '[0-9]+.[0-9]+.x' paths-ignore: - '.github/**' - '!.github/workflows/build.yml' @@ -34,15 +36,41 @@ env: CHANGELOG_ARTIFACTS: changelog 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: name: build (${{ matrix.config.os }}) + needs: run-determination + if: needs.run-determination.outputs.result == '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. + certificate-extension: pfx # File extension for the certificate. - os: ubuntu-20.04 - os: macos-latest # APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from: @@ -57,11 +85,12 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Install Node.js 16.x + - name: Install Node.js 16.14 uses: actions/setup-node@v3 with: - node-version: '16.x' + node-version: '16.14' registry-url: 'https://registry.npmjs.org' + cache: 'yarn' - name: Install Python 3.x uses: actions/setup-python@v4 @@ -105,15 +134,24 @@ jobs: 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 --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 - name: Upload [GitHub Actions] uses: actions/upload-artifact@v3 with: name: ${{ env.JOB_TRANSFER_ARTIFACT }} - path: electron/build/dist/build-artifacts/ + path: electron-app/dist/build-artifacts artifacts: name: ${{ matrix.artifact.name }} artifact @@ -236,7 +274,7 @@ jobs: echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Publish Release [GitHub] - uses: svenstaro/upload-release-action@2.5.0 + uses: svenstaro/upload-release-action@2.7.0 with: repo_token: ${{ secrets.GITHUB_TOKEN }} release_name: ${{ steps.tag_name.outputs.TAG_NAME }} diff --git a/.github/workflows/check-certificates.yml b/.github/workflows/check-certificates.yml index 3e7d81fb5..db5ffc09b 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 diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index d4bb68bb6..2aa398b93 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -6,6 +6,7 @@ env: # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows on: + create: push: paths: - '.github/workflows/check-i18n-task.ya?ml' @@ -22,18 +23,47 @@ 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@v3 - - name: Install Node.js 16.x + - name: Install Node.js 16.14 uses: actions/setup-node@v3 with: - node-version: '16.x' + node-version: '16.14' registry-url: 'https://registry.npmjs.org' + cache: 'yarn' - name: Install Go uses: actions/setup-go@v4 @@ -47,7 +77,7 @@ jobs: version: 3.x - name: Install dependencies - run: yarn + run: yarn install --immutable env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index a2c649593..3b9b5b2ba 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -16,11 +16,12 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Install Node.js 16.x + - name: Install Node.js 16.14 uses: actions/setup-node@v3 with: - node-version: '16.x' + node-version: '16.14' registry-url: 'https://registry.npmjs.org' + cache: 'yarn' - name: Install Go uses: actions/setup-go@v4 @@ -34,7 +35,7 @@ jobs: version: 3.x - 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 9398b0e4f..49f8edc51 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -16,11 +16,12 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Install Node.js 16.x + - name: Install Node.js 16.14 uses: actions/setup-node@v3 with: - node-version: '16.x' + node-version: '16.14' registry-url: 'https://registry.npmjs.org' + cache: 'yarn' - name: Install Go uses: actions/setup-go@v4 @@ -34,7 +35,7 @@ jobs: version: 3.x - name: Install dependencies - run: yarn + run: yarn install --immutable - name: Run i18n:pull script run: yarn run i18n:pull diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index 872f3faec..aaa5d2180 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -23,6 +23,7 @@ jobs: with: node-version: ${{ env.NODE_VERSION }} registry-url: 'https://registry.npmjs.org' + cache: 'yarn' - name: Install Go uses: actions/setup-go@v4 @@ -36,7 +37,7 @@ jobs: version: 3.x - name: Install dependencies - run: yarn + run: yarn install --immutable - name: Run themes:pull script run: yarn run themes:pull diff --git a/.gitignore b/.gitignore index 126d46d96..298d9c059 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/ +resources/ arduino-ide-extension/Examples/ -!electron/build/ 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 +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/.vscode/launch.json b/.vscode/launch.json index 2894c7572..11c115550 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,23 +4,21 @@ { "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", - "--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": { @@ -28,11 +26,11 @@ }, "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,21 +39,23 @@ { "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", - "--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": { @@ -63,11 +63,11 @@ }, "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", @@ -84,7 +84,7 @@ "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", @@ -94,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, @@ -108,19 +116,12 @@ "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)", + "App", "Attach to Electron Frontend" ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 9d3e8e0db..2710dd76f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,7 +2,7 @@ "version": "2.0.0", "tasks": [ { - "label": "Arduino IDE - Rebuild Electron App", + "label": "Rebuild App", "type": "shell", "command": "yarn rebuild:browser && yarn rebuild:electron", "group": "build", @@ -13,7 +13,7 @@ } }, { - "label": "Arduino IDE - Watch IDE Extension", + "label": "Watch Extension", "type": "shell", "command": "yarn --cwd ./arduino-ide-extension watch", "group": "build", @@ -24,7 +24,7 @@ } }, { - "label": "Arduino IDE - Watch Electron App", + "label": "Watch App", "type": "shell", "command": "yarn --cwd ./electron-app watch", "group": "build", @@ -35,11 +35,11 @@ } }, { - "label": "Arduino IDE - Watch All [Electron]", + "label": "Watch All", "type": "shell", "dependsOn": [ - "Arduino IDE - Watch IDE Extension", - "Arduino IDE - Watch Electron App" + "Watch Extension", + "Watch App" ] } ] diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 9d9eb0a7b..eccac3c59 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,74 +1,73 @@ { "name": "arduino-ide-extension", - "version": "2.1.0", + "version": "2.2.0", "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", + "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:slow": "mocha \"./lib/test/**/*.slow-test.js\" --slow 5000", - "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.31.1", - "@theia/core": "1.31.1", - "@theia/debug": "1.31.1", - "@theia/editor": "1.31.1", - "@theia/electron": "1.31.1", - "@theia/filesystem": "1.31.1", - "@theia/keymaps": "1.31.1", - "@theia/markers": "1.31.1", - "@theia/messages": "1.31.1", - "@theia/monaco": "1.31.1", - "@theia/monaco-editor-core": "1.67.2", - "@theia/navigator": "1.31.1", - "@theia/outline-view": "1.31.1", - "@theia/output": "1.31.1", - "@theia/plugin-ext": "1.31.1", - "@theia/preferences": "1.31.1", - "@theia/scm": "1.31.1", - "@theia/search-in-workspace": "1.31.1", - "@theia/terminal": "1.31.1", - "@theia/typehierarchy": "1.31.1", - "@theia/workspace": "1.31.1", + "@grpc/grpc-js": "^1.8.14", + "@theia/application-package": "1.39.0", + "@theia/core": "1.39.0", + "@theia/debug": "1.39.0", + "@theia/editor": "1.39.0", + "@theia/electron": "1.39.0", + "@theia/filesystem": "1.39.0", + "@theia/keymaps": "1.39.0", + "@theia/markers": "1.39.0", + "@theia/messages": "1.39.0", + "@theia/monaco": "1.39.0", + "@theia/monaco-editor-core": "1.72.3", + "@theia/navigator": "1.39.0", + "@theia/outline-view": "1.39.0", + "@theia/output": "1.39.0", + "@theia/plugin-ext": "1.39.0", + "@theia/preferences": "1.39.0", + "@theia/scm": "1.39.0", + "@theia/search-in-workspace": "1.39.0", + "@theia/terminal": "1.39.0", + "@theia/typehierarchy": "1.39.0", + "@theia/workspace": "1.39.0", "@tippyjs/react": "^4.2.5", "@types/auth0-js": "^9.14.0", "@types/btoa": "^1.2.3", "@types/dateformat": "^3.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/node-fetch": "^2.5.7", "@types/p-queue": "^2.3.1", "@types/ps-tree": "^1.1.0", "@types/react-tabs": "^2.3.2", "@types/temp": "^0.8.34", - "@types/which": "^1.3.1", - "@vscode/debugprotocol": "^1.51.0", "arduino-serial-plotter-webapp": "0.2.0", "async-mutex": "^0.3.0", "auth0-js": "^9.14.0", "btoa": "^1.2.1", "classnames": "^2.3.1", - "cpy": "^8.1.2", + "cpy": "^10.0.0", "cross-fetch": "^3.1.5", "dateformat": "^3.0.3", - "deepmerge": "2.0.1", + "deepmerge": "^4.2.2", + "drivelist": "^9.2.4", "electron-updater": "^4.6.5", "fast-json-stable-stringify": "^2.1.0", "fast-safe-stringify": "^2.1.1", @@ -76,8 +75,9 @@ "glob": "^7.1.6", "google-protobuf": "^3.20.1", "hash.js": "^1.1.7", - "is-online": "^9.0.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", @@ -85,9 +85,11 @@ "lodash.debounce": "^4.0.8", "minimatch": "^3.1.2", "node-fetch": "^2.6.1", + "node-log-rotate": "^0.1.5", "open": "^8.0.6", "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.1", @@ -101,33 +103,34 @@ "temp": "^0.9.1", "temp-dir": "^2.0.0", "tree-kill": "^1.2.1", - "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/react-window": "^1.8.5", + "@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", "mockdate": "^3.0.5", "moment": "^2.24.0", "ncp": "^2.0.0", - "protoc": "^1.0.4", + "rimraf": "^2.6.1", "shelljs": "^0.8.3", "uuid": "^3.2.1", "yargs": "^11.1.0" }, "optionalDependencies": { - "grpc-tools": "^1.9.0" + "grpc-tools": "^1.9.0", + "protoc": "^1.0.4" }, "mocha": { "require": [ @@ -147,6 +150,9 @@ "examples" ], "theiaExtensions": [ + { + "preload": "lib/electron-browser/preload" + }, { "backend": "lib/node/arduino-ide-backend-module", "frontend": "lib/browser/arduino-ide-frontend-module" @@ -157,22 +163,25 @@ { "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.32.2" + "arduino-cli": { + "version": "0.34.0" }, - "fwuploader": { - "version": "2.2.2" + "arduino-fwuploader": { + "version": "2.4.0" + }, + "arduino-language-server": { + "version": "0.7.4" }, "clangd": { "version": "14.0.0" - }, - "languageServer": { - "version": "0.7.4" } } } diff --git a/arduino-ide-extension/scripts/download-cli.js b/arduino-ide-extension/scripts/download-cli.js index 564f80e6a..7fbe70d87 100755 --- a/arduino-ide-extension/scripts/download-cli.js +++ b/arduino-ide-extension/scripts/download-cli.js @@ -19,7 +19,7 @@ return undefined; } - const { cli } = arduino; + const cli = arduino['arduino-cli']; if (!cli) { return undefined; } @@ -34,9 +34,15 @@ } 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 = (() => { diff --git a/arduino-ide-extension/scripts/download-examples.js b/arduino-ide-extension/scripts/download-examples.js index 6d2d3debd..d34732408 100644 --- a/arduino-ide-extension/scripts/download-examples.js +++ b/arduino-ide-extension/scripts/download-examples.js @@ -4,33 +4,45 @@ const version = '1.10.0'; (async () => { - const os = require('os'); - const { promises: fs } = require('fs'); - const path = require('path'); + const os = require('node:os'); + const { existsSync, promises: fs } = require('node:fs'); + const path = require('node:path'); const shell = require('shelljs'); const { v4 } = require('uuid'); + const { exec } = require('./utils'); + + const destination = path.join( + __dirname, + '..', + 'src', + 'node', + 'resources', + 'Examples' + ); + if (existsSync(destination)) { + shell.echo( + `Skipping Git checkout of the examples because the repository already exists: ${destination}` + ); + return; + } const repository = path.join(os.tmpdir(), `${v4()}-arduino-examples`); if (shell.mkdir('-p', repository).code !== 0) { shell.exit(1); } - if ( - shell.exec( - `git clone https://github.com/arduino/arduino-examples.git ${repository}` - ).code !== 0 - ) { - shell.exit(1); - } + exec( + 'git', + ['clone', 'https://github.com/arduino/arduino-examples.git', repository], + shell + ); - if ( - shell.exec(`git -C ${repository} checkout tags/${version} -b ${version}`) - .code !== 0 - ) { - shell.exit(1); - } + exec( + 'git', + ['-C', repository, 'checkout', `tags/${version}`, '-b', version], + shell + ); - const destination = path.join(__dirname, '..', 'Examples'); shell.mkdir('-p', destination); shell.cp('-fR', path.join(repository, 'examples', '*'), destination); diff --git a/arduino-ide-extension/scripts/download-fwuploader.js b/arduino-ide-extension/scripts/download-fwuploader.js index 4c13b628a..6cc13338f 100755 --- a/arduino-ide-extension/scripts/download-fwuploader.js +++ b/arduino-ide-extension/scripts/download-fwuploader.js @@ -1,12 +1,11 @@ // @ts-check (async () => { - const fs = require('fs'); - const path = require('path'); - const temp = require('temp'); + const path = require('node:path'); const shell = require('shelljs'); const semver = require('semver'); const downloader = require('./downloader'); + const { taskBuildFromGit } = require('./utils'); const version = (() => { const pkg = require(path.join(__dirname, '..', 'package.json')); @@ -19,7 +18,7 @@ return undefined; } - const { fwuploader } = arduino; + const fwuploader = arduino['arduino-fwuploader']; if (!fwuploader) { return undefined; } @@ -36,11 +35,17 @@ } 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 = (() => { @@ -86,81 +91,6 @@ shell.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 991dfb07d..0dbb8b3cf 100755 --- a/arduino-ide-extension/scripts/download-ls.js +++ b/arduino-ide-extension/scripts/download-ls.js @@ -16,7 +16,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]; @@ -62,35 +63,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(build, 'clangd'); - clangFormatExecutablePath = path.join(build, 'clang-format'); + 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; @@ -110,20 +126,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..ed62aa1b9 100644 --- a/arduino-ide-extension/scripts/downloader.js +++ b/arduino-ide-extension/scripts/downloader.js @@ -1,7 +1,6 @@ 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'); @@ -47,6 +46,7 @@ exports.downloadUnzipFile = async ( } shell.echo(`>>> Downloading from '${url}'...`); + const { default: download } = await import('@xhmikosr/downloader'); const data = await download(url); shell.echo(`<<< Download succeeded.`); @@ -107,6 +107,7 @@ exports.downloadUnzipAll = async ( } shell.echo(`>>> Downloading from '${url}'...`); + const { default: download } = await import('@xhmikosr/downloader'); const data = await download(url); shell.echo(`<<< Download succeeded.`); diff --git a/arduino-ide-extension/scripts/generate-protocol.js b/arduino-ide-extension/scripts/generate-protocol.js index ca51d6d71..f0737a2ec 100644 --- a/arduino-ide-extension/scripts/generate-protocol.js +++ b/arduino-ide-extension/scripts/generate-protocol.js @@ -1,156 +1,190 @@ // @ts-check (async () => { - - 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 os = require('node:os'); + const path = require('node:path'); + const { exec } = require('./utils'); + const glob = require('glob'); + const { v4 } = require('uuid'); + const shell = require('shelljs'); + const protoc = path.dirname(require('protoc/protoc')); + + 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) { + shell.echo(`Could not parse the 'package.json'.`); + shell.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 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); - } - 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); - } - // 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", - "Commit": "079bb6c6", - "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}'.`); - } 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}'.`); - } else { - shell.echo(`WARN: no 'git checkout'. Generating from the HEAD revision.`); + const defaultVersion = { + owner: 'arduino', + repo: 'arduino-cli', + commitish: undefined, + }; + const { arduino } = pkg; + if (!arduino) { + return defaultVersion; } - shell.echo('>>> Generating TS/JS API from:'); - if (shell.exec(`git -C ${repository} rev-parse --abbrev-ref HEAD`).code !== 0) { - shell.exit(1); + const cli = arduino['arduino-cli']; + if (!cli) { + return defaultVersion; } - 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); + const { version } = cli; + if (!version) { + return defaultVersion; } - // 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); + if (typeof version === 'string') { + return defaultVersion; } - // 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); + // 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); } - shell.echo('<<< Generation was successful.'); - + return { owner, repo, commitish }; + })(); + + const url = `https://github.com/${owner}/${repo}.git`; + shell.echo(`>>> Cloning repository from '${url}'...`); + exec('git', ['clone', url, repository], shell); + shell.echo(`<<< Repository cloned.`); + + 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'], shell).trim(); + if (!versionJson) { + shell.echo(`Could not retrieve the CLI version from ${cli}.`); + shell.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", + "Commit": "079bb6c6", + "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}'...`); + exec('git', ['-C', repository, 'fetch', '--all', '--tags'], shell); + exec( + 'git', + ['-C', repository, 'checkout', `tags/${version}`, '-b', version], + shell + ); + shell.echo(`<<< Checked out tagged version: '${version}'.`); + } else if (commitish) { + shell.echo( + `>>> Checking out commitish from 'package.json': '${commitish}'...` + ); + exec('git', ['-C', repository, 'checkout', commitish], shell); + shell.echo( + `<<< Checked out commitish from 'package.json': '${commitish}'.` + ); + } else if (versionObject.Commit) { + shell.echo( + `>>> Checking out commitish from the CLI: '${versionObject.Commit}'...` + ); + exec('git', ['-C', repository, 'checkout', versionObject.Commit], shell); + shell.echo( + `<<< Checked out commitish from the CLI: '${versionObject.Commit}'.` + ); + } else { + shell.echo(`WARN: no 'git checkout'. Generating from the HEAD revision.`); + } + + shell.echo('>>> Generating TS/JS API from:'); + exec('git', ['-C', repository, 'rev-parse', '--abbrev-ref', 'HEAD'], shell); + + 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 ?? error.message); + 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); + } + + // Generate JS code from the `.proto` files. + + exec( + 'grpc_tools_node_protoc', + [ + `--js_out=import_style=commonjs,binary:${out}`, + `--grpc_out=generate_package_definition:${out}`, + '-I', + rpc, + ...protos, + ], + shell + ); + + // Generate the `.d.ts` files for JS. + 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', + rpc, + ...protos, + ], + shell + ); + + shell.echo('<<< Generation was successful.'); })(); diff --git a/arduino-ide-extension/scripts/utils.js b/arduino-ide-extension/scripts/utils.js index c7ca7851e..b932b444c 100644 --- a/arduino-ide-extension/scripts/utils.js +++ b/arduino-ide-extension/scripts/utils.js @@ -1,3 +1,31 @@ +// @ts-check + +const exec = ( + /** @type {string} */ command, + /** @type {readonly string[]} */ args, + /** @type {import('shelljs')|undefined}*/ shell = undefined, + /** @type {import('node:child_process').ExecFileSyncOptionsWithStringEncoding|undefined} */ options = undefined +) => { + try { + const stdout = require('node:child_process').execFileSync( + command, + args, + options ? options : { encoding: 'utf8' } + ); + if (shell) { + shell.echo(stdout.trim()); + } + return stdout; + } catch (err) { + if (shell) { + shell.echo(err instanceof Error ? err.message : String(err)); + shell.exit(1); + } + throw err; + } +}; +exports.exec = exec; + /** * Clones something from GitHub and builds it with [`Task`](https://taskfile.dev/). * @@ -21,11 +49,15 @@ 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'); @@ -58,31 +90,33 @@ function buildFromGit(command, version, destinationPath, taskName) { return; } - const buildFolder = path.join(__dirname, '..', 'build'); - if (shell.mkdir('-p', buildFolder).code !== 0) { - shell.echo('Could not create build folder.'); + const resourcesFolder = path.join( + __dirname, + '..', + 'src', + 'node', + 'resources' + ); + if (shell.mkdir('-p', resourcesFolder).code !== 0) { + shell.echo('Could not create resources folder.'); shell.exit(1); } const tempRepoPath = temp.mkdirSync(); shell.echo(`>>> Cloning ${taskName} source to ${tempRepoPath}...`); - if (shell.exec(`git clone ${url} ${tempRepoPath}`).code !== 0) { - shell.exit(1); - } + exec('git', ['clone', url, tempRepoPath], shell); shell.echo(`<<< Cloned ${taskName} repo.`); if (commitish) { shell.echo(`>>> Checking out ${commitish}...`); - if (shell.exec(`git -C ${tempRepoPath} checkout ${commitish}`).code !== 0) { - shell.exit(1); - } + exec('git', ['-C', tempRepoPath, 'checkout', commitish], shell); shell.echo(`<<< Checked out ${commitish}.`); } + exec('git', ['-C', tempRepoPath, 'rev-parse', '--short', 'HEAD'], shell); + shell.echo(`>>> Building the ${taskName}...`); - if (shell.exec(`${command} build`, { cwd: tempRepoPath }).code !== 0) { - shell.exit(1); - } + exec(command, ['build'], shell, { cwd: tempRepoPath, encoding: 'utf8' }); shell.echo(`<<< Done ${taskName} build.`); const binName = path.basename(destinationPath); 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 f4353570a..9ca0a9c61 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -1,41 +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 { 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'; +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 { ElectronWindowPreferences } from '@theia/core/lib/electron-browser/window/electron-window-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 @@ -44,7 +50,8 @@ export class ArduinoFrontendContribution TabBarToolbarContribution, CommandContribution, MenuContribution, - ColorContribution + ColorContribution, + StylingParticipant { @inject(MessageService) private readonly messageService: MessageService; @@ -62,7 +69,7 @@ export class ArduinoFrontendContribution 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( @@ -80,8 +87,7 @@ export class ArduinoFrontendContribution switch (event.preferenceName) { case 'window.zoomLevel': if (typeof event.newValue === 'number') { - const webContents = remote.getCurrentWebContents(); - webContents.setZoomLevel(event.newValue || 0); + window.electronTheiaCore.setZoomLevel(event.newValue || 0); } break; } @@ -89,10 +95,9 @@ export class ArduinoFrontendContribution }); this.appStateService.reachedState('ready').then(() => this.electronWindowPreferences.ready.then(() => { - const webContents = remote.getCurrentWebContents(); const zoomLevel = this.electronWindowPreferences.get('window.zoomLevel'); - webContents.setZoomLevel(zoomLevel); + window.electronTheiaCore.setZoomLevel(zoomLevel); }) ); } @@ -168,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.', @@ -178,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.', @@ -188,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', @@ -198,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"', @@ -208,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)', @@ -218,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.', }, @@ -257,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.', @@ -267,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.', }, @@ -276,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 8a5b4467a..0300429c9 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -1,5 +1,5 @@ import '../../src/browser/style/index.css'; -import { Container, ContainerModule } from '@theia/core/shared/inversify'; +import { 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'; @@ -27,7 +27,10 @@ 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'; @@ -61,7 +64,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'; @@ -100,7 +102,7 @@ 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/lib/common/logger'; import { bindContributionProvider } from '@theia/core/lib/common/contribution-provider'; @@ -208,7 +210,6 @@ 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'; @@ -295,7 +296,7 @@ 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 './contributions/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'; @@ -341,16 +342,6 @@ import { TypeHierarchyContribution } from './theia/typehierarchy/type-hierarchy- 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 { DebugToolbar } from './theia/debug/debug-toolbar-widget'; -import { DebugToolBar as TheiaDebugToolbar } from '@theia/debug/lib/browser/view/debug-toolbar-widget'; -import { PluginMenuCommandAdapter } from './theia/plugin-ext/plugin-menu-command-adapter'; -import { PluginMenuCommandAdapter as TheiaPluginMenuCommandAdapter } from '@theia/plugin-ext/lib/main/browser/menus/plugin-menu-command-adapter'; -import { DebugSessionManager } from './theia/debug/debug-session-manager'; -import { DebugSessionManager as TheiaDebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager'; -import { DebugWidget } from '@theia/debug/lib/browser/view/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/lib/browser/view/debug-configuration-widget'; import { ConfigServiceClient } from './config/config-service-client'; import { ValidateSketch } from './contributions/validate-sketch'; import { RenameCloudSketch } from './contributions/rename-cloud-sketch'; @@ -361,15 +352,32 @@ import { SidebarBottomMenuWidget as TheiaSidebarBottomMenuWidget } from '@theia/ 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'; + +// 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); @@ -438,11 +446,9 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { 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); // Logger for the Arduino daemon @@ -471,7 +477,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(OpenHandler).toService(BoardsListWidgetFrontendContribution); // Board select dialog - bind(BoardsConfigDialogWidget).toSelf().inSingletonScope(); bind(BoardsConfigDialog).toSelf().inSingletonScope(); bind(BoardsConfigDialogProps).toConstantValue({ title: nls.localize( @@ -722,7 +727,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); @@ -743,6 +748,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { Contribution.configure(bind, Account); Contribution.configure(bind, CloudSketchbookContribution); Contribution.configure(bind, CreateCloudCopy); + Contribution.configure(bind, UpdateArduinoState); + Contribution.configure(bind, BoardsDataMenuUpdater); bindContributionProvider(bind, StartupTaskProvider); bind(StartupTaskProvider).toService(BoardsServiceProvider); // to reuse the boards config in another window @@ -871,9 +878,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(); @@ -982,9 +986,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // 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(FrontendApplicationContribution).toService(CleanupObsoleteThemes); bind(ThemesRegistrationSummary).toSelf().inSingletonScope(); bind(MonacoThemeRegistry).toSelf().inSingletonScope(); rebind(TheiaMonacoThemeRegistry).toService(MonacoThemeRegistry); @@ -998,37 +1000,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(TypeHierarchyContribution).toSelf().inSingletonScope(); rebind(TheiaTypeHierarchyContribution).toService(TypeHierarchyContribution); - // patched the debugger for `cortex-debug@1.5.1` - // https://github.com/eclipse-theia/theia/issues/11871 - // https://github.com/eclipse-theia/theia/issues/11879 - // https://github.com/eclipse-theia/theia/issues/11880 - // https://github.com/eclipse-theia/theia/issues/11885 - // https://github.com/eclipse-theia/theia/issues/11886 - // https://github.com/eclipse-theia/theia/issues/11916 - // based on: https://github.com/eclipse-theia/theia/compare/master...kittaakos:theia:%2311871 bind(DefaultDebugSessionFactory).toSelf().inSingletonScope(); rebind(DebugSessionFactory).toService(DefaultDebugSessionFactory); - bind(DebugSessionManager).toSelf().inSingletonScope(); - rebind(TheiaDebugSessionManager).toService(DebugSessionManager); - bind(DebugToolbar).toSelf().inSingletonScope(); - rebind(TheiaDebugToolbar).toService(DebugToolbar); - bind(PluginMenuCommandAdapter).toSelf().inSingletonScope(); - rebind(TheiaPluginMenuCommandAdapter).toService(PluginMenuCommandAdapter); - bind(WidgetFactory) - .toDynamicValue(({ container }) => ({ - id: DebugWidget.ID, - createWidget: () => { - const child = new Container({ defaultScope: 'Singleton' }); - child.parent = container; - child.bind(DebugViewModel).toSelf(); - child.bind(DebugToolbar).toSelf(); // patched toolbar - child.bind(DebugSessionWidget).toSelf(); - child.bind(DebugConfigurationWidget).toSelf(); - child.bind(DebugWidget).toSelf(); - return child.get(DebugWidget); - }, - })) - .inSingletonScope(); bind(SidebarBottomMenuWidget).toSelf(); rebind(TheiaSidebarBottomMenuWidget).toService(SidebarBottomMenuWidget); @@ -1043,4 +1016,18 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // 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 + ); }); diff --git a/arduino-ide-extension/src/browser/arduino-preferences.ts b/arduino-ide-extension/src/browser/arduino-preferences.ts index 5adc8b9c2..ebe525d60 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,225 +43,254 @@ 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'; +} + +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.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: '', + 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.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, + }, + '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: '', - 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.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, - }, - '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, - }, - }, + properties, }; export interface ArduinoConfiguration { @@ -288,6 +320,7 @@ export interface ArduinoConfiguration { '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/auth/authentication-client-service.ts b/arduino-ide-extension/src/browser/auth/authentication-client-service.ts index ccdb99ffa..bf92eb1c7 100644 --- a/arduino-ide-extension/src/browser/auth/authentication-client-service.ts +++ b/arduino-ide-extension/src/browser/auth/authentication-client-service.ts @@ -9,13 +9,13 @@ import { 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'], 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 6d95ea661..4b0f45e69 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 { MessageService } from '@theia/core/lib/common/message-service'; import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { DisposableCollection } from '@theia/core/lib/common/disposable'; +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 { 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( - ({ installedVersion }) => !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..acf2c7d4e --- /dev/null +++ b/arduino-ide-extension/src/browser/boards/boards-config-component.tsx @@ -0,0 +1,328 @@ +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; + } +} + +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 ? ( + '' + ) : ( +
+ +
+ )} +
+ ); + } + + 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 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} + /> + )); + + 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 b08c6de36..000000000 --- a/arduino-ide-extension/src/browser/boards/boards-config-dialog.ts +++ /dev/null @@ -1,142 +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.node.id = 'select-board-dialog-container'; - 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..79e5e9183 --- /dev/null +++ b/arduino-ide-extension/src/browser/boards/boards-config-dialog.tsx @@ -0,0 +1,202 @@ +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( + 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(); + } + + 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 8781981e6..000000000 --- a/arduino-ide-extension/src/browser/boards/boards-config.tsx +++ /dev/null @@ -1,432 +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, - BoardConfig as ProtocolBoardConfig, - 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 type Config = ProtocolBoardConfig; - - 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.boardsServiceProvider.onAvailablePortsChanged( - ({ newState, oldState }) => { - const removedPorts = oldState.filter( - (oldPort) => - !newState.find((newPort) => Port.sameAs(newPort, oldPort)) - ); - this.updatePorts(newState, removedPorts); - } - ), - 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.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) => - 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( - 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) - )} - - ); - } - - 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); - } - } - - 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} - /> - )); - - return ( - -
- - -
- {boardsList.length > 0 ? ( -
{boardsList}
- ) : ( -
- {nls.localize( - 'arduino/board/noBoardsFound', - 'No boards found for "{0}"', - query - )} -
- )} -
- ); - } - - 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}` : ''}`; - } - } -} 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 cdf73d18f..52507a577 100644 --- a/arduino-ide-extension/src/browser/boards/boards-data-store.ts +++ b/arduino-ide-extension/src/browser/boards/boards-data-store.ts @@ -1,63 +1,64 @@ -import { injectable, inject, named } from '@theia/core/shared/inversify'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +import { LocalStorageService } from '@theia/core/lib/browser/storage-service'; +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 { inject, injectable, named } from '@theia/core/shared/inversify'; import { + BoardDetails, BoardsService, ConfigOption, - BoardDetails, Programmer, } from '../../common/protocol'; +import { notEmpty } from '../../common/utils'; import { NotificationCenter } from '../notification-center'; @injectable() export class BoardsDataStore implements FrontendApplicationContribution { @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; - + private readonly notificationCenter: NotificationCenter; @inject(LocalStorageService) - protected readonly storageService: LocalStorageService; + private readonly storageService: LocalStorageService; - protected readonly onChangedEmitter = new Emitter(); + private readonly onChangedEmitter = new Emitter(); + private readonly toDispose = new DisposableCollection(this.onChangedEmitter); onStart(): void { - this.notificationCenter.onPlatformDidInstall(async ({ item }) => { - const dataDidChangePerFqbn: string[] = []; - 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); - if (details) { - data = details.configOptions; - if (data.length) { - await this.storageService.setData(key, data); - dataDidChangePerFqbn.push(fqbn); + this.toDispose.push( + this.notificationCenter.onPlatformDidInstall(async ({ item }) => { + const dataDidChangePerFqbn: string[] = []; + 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(key); + if (!data || !data.length) { + const details = await this.getBoardDetailsSafe(fqbn); + if (details) { + data = details.configOptions; + if (data.length) { + await this.storageService.setData(key, data); + dataDidChangePerFqbn.push(fqbn); + } } } } - } - if (dataDidChangePerFqbn.length) { - this.fireChanged(...dataDidChangePerFqbn); - } - }); + if (dataDidChangePerFqbn.length) { + this.fireChanged(...dataDidChangePerFqbn); + } + }) + ); + } + + onStop(): void { + this.toDispose.dispose(); } get onChanged(): Event { @@ -65,7 +66,7 @@ export class BoardsDataStore implements FrontendApplicationContribution { } async appendConfigToFqbn( - fqbn: string | undefined, + fqbn: string | undefined ): Promise { if (!fqbn) { return undefined; @@ -100,12 +101,13 @@ export class BoardsDataStore implements FrontendApplicationContribution { return data; } - async selectProgrammer( - { - fqbn, - selectedProgrammer, - }: { fqbn: string; selectedProgrammer: Programmer }, - ): Promise { + async selectProgrammer({ + fqbn, + selectedProgrammer, + }: { + fqbn: string; + selectedProgrammer: Programmer; + }): Promise { const data = deepClone(await this.getData(fqbn)); const { programmers } = data; if (!programmers.find((p) => Programmer.equals(selectedProgrammer, p))) { @@ -120,13 +122,15 @@ export class BoardsDataStore implements FrontendApplicationContribution { return true; } - async selectConfigOption( - { - fqbn, - option, - selectedValue, - }: { fqbn: string; option: string; selectedValue: string } - ): Promise { + 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); 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 279a2e3fa..f1182adbf 100644 --- a/arduino-ide-extension/src/browser/boards/boards-service-provider.ts +++ b/arduino-ide-extension/src/browser/boards/boards-service-provider.ts @@ -1,37 +1,162 @@ -import { injectable, inject } from '@theia/core/shared/inversify'; -import { Emitter } from '@theia/core/lib/common/event'; -import { ILogger } from '@theia/core/lib/common/logger'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; +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 { 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 { 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, + OutputChannel, + OutputChannelManager, +} from '@theia/output/lib/browser/output-channel'; +import { + BoardIdentifier, + boardIdentifierEquals, + BoardsConfig, + BoardsConfigChangeEvent, BoardsPackage, - AttachedBoardsChangeEvent, - BoardWithPackage, + BoardsService, BoardUserField, - AvailablePorts, + BoardWithPackage, + DetectedPorts, + emptyBoardsConfig, + isBoardIdentifier, + isBoardIdentifierChangeEvent, + isPortIdentifier, + isPortIdentifierChangeEvent, + Port, + PortIdentifier, + portIdentifierEquals, + serializePlatformIdentifier, } from '../../common/protocol'; -import { BoardsConfig } from './boards-config'; -import { naturalCompare } from '../../common/utils'; -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'; import { + BoardList, + BoardListHistory, + createBoardList, + EditBoardsConfigActionParams, + isBoardListHistory, + SelectBoardsConfigActionParams, +} 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'; + +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'; + +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; + +@injectable() +export class BoardListDumper implements Disposable { + @inject(OutputChannelManager) + private readonly outputChannelManager: OutputChannelManager; + + private outputChannel: OutputChannel | undefined; + + 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'); + } + + dispose(): void { + this.outputChannel?.dispose(); + } +} @injectable() export class BoardsServiceProvider @@ -41,402 +166,280 @@ export class BoardsServiceProvider CommandContribution { @inject(ILogger) - protected logger: ILogger; - + private readonly logger: ILogger; @inject(MessageService) - protected messageService: MessageService; - + private readonly messageService: MessageService; @inject(BoardsService) - protected boardsService: BoardsService; - + private readonly boardsService: BoardsService; @inject(CommandService) - protected commandService: 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<{ - newState: Port[]; - oldState: Port[]; - }>(); - private readonly inheritedConfig = new Deferred(); + 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.onPlatformDidInstall( - this.notifyPlatformInstalled.bind(this) + this.notificationCenter.onDetectedPortsDidChange(({ detectedPorts }) => + this.refreshBoardList({ detectedPorts }) ); - this.notificationCenter.onPlatformDidUninstall( - this.notifyPlatformUninstalled.bind(this) + this.notificationCenter.onPlatformDidInstall((event) => + this.maybeUpdateSelectedBoard(event) ); + 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()); + } - 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; - const oldState = this._availablePorts.slice(); - this._availablePorts = availablePorts; - this.onAvailablePortsChangedEmitter.fire({ - newState: this._availablePorts.slice(), - oldState, - }); - - await this.reconcileAvailableBoards(); - - this.tryReconnect(); - this._reconciled.resolve(); - }); + onStop(): void { + this.boardListDumper?.dispose(); } registerCommands(registry: CommandRegistry): void { registry.registerCommand(USE_INHERITED_CONFIG, { - execute: (inheritedConfig: BoardsConfig.Config) => - this.inheritedConfig.resolve(inheritedConfig), + 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), + ]); + }, }); } - get reconciled(): Promise { - return this._reconciled.promise; + tasks(): StartupTask[] { + return [ + { + command: USE_INHERITED_CONFIG.id, + args: [this._boardsConfig, this._boardListHistory], + }, + ]; } - snapshotBoardDiscoveryOnUpload(): void { - this.lastBoardsConfigOnUpload = this._boardsConfig; - this.lastAvailablePortsOnUpload = this._availablePorts; + 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); } - clearBoardDiscoverySnapshot(): void { - this.lastBoardsConfigOnUpload = undefined; - this.lastAvailablePortsOnUpload = undefined; + private createBoardListUI(boardList: BoardList): BoardListUI { + return Object.assign(boardList, { + select: this.onBoardsConfigSelect.bind(this), + edit: this.onBoardsConfigEdit.bind(this), + }); } - attemptPostUploadAutoSelect(): void { - setTimeout(() => { - if (this.lastBoardsConfigOnUpload && this.lastAvailablePortsOnUpload) { - this.attemptAutoSelect({ - ports: this._availablePorts, - boards: this._availableBoards, - }); - } - }, 2000); // 2 second delay same as IDE 1.8 + private onBoardsConfigSelect(params: SelectBoardsConfigActionParams): void { + this.updateConfig({ ...params, reason: 'toolbar' }); } - private attemptAutoSelect( - newState: AttachedBoardsChangeEvent['newState'] - ): void { - this.deriveBoardConfigToAutoSelect(newState); - this.tryReconnect(); + 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.lastBoardsConfigOnUpload || !this.lastAvailablePortsOnUpload) { - 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; - - const appearedPorts = - oldPorts.length > 0 - ? newPorts.filter((newPort: Port) => - oldPorts.every((oldPort: Port) => !Port.sameAs(newPort, oldPort)) - ) - : newPorts; - - for (const port of appearedPorts) { - const boardOnAppearedPort = newBoards.find((board: Board) => - Port.sameAs(board.port, port) - ); - - const lastBoardsConfigOnUpload = this.lastBoardsConfigOnUpload; - - if (boardOnAppearedPort && lastBoardsConfigOnUpload.selectedBoard) { - const boardIsSameHardware = Board.hardwareIdEquals( - boardOnAppearedPort, - lastBoardsConfigOnUpload.selectedBoard - ); - - const boardIsSameFqbn = Board.sameAs( - boardOnAppearedPort, - lastBoardsConfigOnUpload.selectedBoard - ); - - if (!boardIsSameHardware && !boardIsSameFqbn) continue; - - let boardToAutoSelect = boardOnAppearedPort; - if (boardIsSameHardware && !boardIsSameFqbn) { - const { name, fqbn } = lastBoardsConfigOnUpload.selectedBoard; - - boardToAutoSelect = { - ...boardToAutoSelect, - name: - boardToAutoSelect.name === Unknown || !boardToAutoSelect.name - ? name - : boardToAutoSelect.name, - fqbn: boardToAutoSelect.fqbn || fqbn, - }; - } - - this.clearBoardDiscoverySnapshot(); - - this.boardConfigToAutoSelect = { - selectedBoard: boardToAutoSelect, - selectedPort: port, + 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 + ? { selectedBoard: boardToSelect, previousSelectedBoard } + : undefined; + const portDidChangeEvent = portDidChange + ? { selectedPort: portToSelect, previousSelectedPort } + : undefined; + + let event: BoardsConfigChangeEvent | undefined = boardDidChangeEvent; + if (portDidChangeEvent) { + if (event) { + event = { + ...event, + ...portDidChangeEvent, }; - return; + } else { + event = portDidChangeEvent; } } - } + if (!event) { + return false; + } - 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('------------------------------------------'); + this.maybeUpdateBoardListHistory({ portToSelect, boardToSelect }); + this.maybeUpdateBoardsData({ boardToSelect, reason }); + + if (isBoardIdentifierChangeEvent(event)) { + this._boardsConfig.selectedBoard = event.selectedBoard; + } + if (isPortIdentifierChangeEvent(event)) { + this._boardsConfig.selectedPort = event.selectedPort; } - this._attachedBoards = event.newState.boards; - const oldState = this._availablePorts.slice(); - this._availablePorts = event.newState.ports; - this.onAvailablePortsChangedEmitter.fire({ - newState: this._availablePorts.slice(), - oldState, - }); - 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.hardwareIdEquals(availableBoard, selectedBoard) || - 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)) { - // ** Reconnect to a board unplugged from, and plugged back into the same port - for (const board of this.availableBoards.filter( - ({ state }) => state !== AvailableBoard.State.incomplete - )) { - if ( - Board.hardwareIdEquals( - this.latestValidBoardsConfig.selectedBoard, - board - ) - ) { - const { name, fqbn } = this.latestValidBoardsConfig.selectedBoard; - this.boardsConfig = { - selectedBoard: { - name: board.name === Unknown || !board.name ? name : board.name, - fqbn: board.fqbn || fqbn, - port: board.port, - }, - selectedPort: board.port, - }; - return true; - } - - 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; - } - } - // ** - - // ** Reconnect to a board whose port changed due to an upload - 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[]; @@ -459,317 +462,162 @@ export class BoardsServiceProvider 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; } - availableBoards.push(availableBoard); + if (match) { + return { [portKey]: undefined }; + } + 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') ) { - let port = boardsConfig.selectedPort; - // 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) { - // get the "Unknown board port" that we will substitute, - // then we can include it in the "availableBoard object" - // pushed below; to ensure addressLabel is included - port = availableBoards[found].port; - 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, - 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 startup task. Wait for it, then timeout. Maybe it never arrives. - if (!storedLatestBoardsConfig) { - storedLatestBoardsConfig = await Promise.race([ - this.inheritedConfig.promise, - new Promise((resolve) => - setTimeout(() => resolve(undefined), 2_000) - ), - ]); - } - 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 - ); - } - - tasks(): StartupTask[] { - return [ - { - command: USE_INHERITED_CONFIG.id, - args: [this.boardsConfig], - }, - ]; + return this.storageService.getData(key); } } @@ -787,77 +635,26 @@ const USE_INHERITED_CONFIG: Command = { id: 'arduino-use-inherited-boards-config', }; -/** - * 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. - */ -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; - } +const DUMP_BOARD_LIST: Command = { + id: 'arduino-dump-board-list', + label: nls.localize('arduino/developer/dumpBoardList', 'Dump the Board List'), + category: 'Developer (Arduino)', +}; - export function hasPort( - board: AvailableBoard - ): board is AvailableBoard & { port: Port } { - return !!board.port; - } +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)', +}; - // 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 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/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/contributions/about.ts b/arduino-ide-extension/src/browser/contributions/about.ts index cf22508f4..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,17 +38,18 @@ export class About extends Contribution { }); } - async showAbout(): Promise { - const version = 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}\n\n{4}', - remote.app.getVersion(), + appVersion, buildDate ? buildDate : nls.localize('', 'dev build'), buildDate && showAll ? ` (${this.ago(buildDate)})` : '', - version, + cliVersion, nls.localize( 'arduino/about/copyright', 'Copyright © {0} Arduino SA', @@ -60,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/add-file.ts b/arduino-ide-extension/src/browser/contributions/add-file.ts index dacbd4e86..da1796048 100644 --- a/arduino-ide-extension/src/browser/contributions/add-file.ts +++ b/arduino-ide-extension/src/browser/contributions/add-file.ts @@ -1,22 +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, - URI, Sketch, + SketchContribution, + URI, } from './contribution'; -import { FileDialogService } from '@theia/filesystem/lib/browser'; -import { nls } from '@theia/core/lib/common'; -import { CurrentSketch } from '../sketches-service-client-impl'; @injectable() export class AddFile extends SketchContribution { @inject(FileDialogService) - private readonly fileDialogService: FileDialogService; + private readonly fileDialogService: FileDialogService; // TODO: use dialogService override registerCommands(registry: CommandRegistry): void { registry.registerCommand(AddFile.Commands.ADD_FILE, { @@ -50,7 +49,7 @@ export class AddFile extends SketchContribution { 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: [ 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 0fdc27121..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,5 +1,4 @@ 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 { ArduinoMenus } from '../menu/arduino-menus'; @@ -42,23 +41,20 @@ export class AddZipLibrary extends SketchContribution { 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( - remote.getCurrentWindow(), - { - title: nls.localize( - 'arduino/selectZip', - "Select a zip file containing the library you'd like to add" - ), - defaultPath, - properties: ['openFile'], - filters: [ - { - name: nls.localize('arduino/library/zipLibrary', 'Library'), - extensions: ['zip'], - }, - ], - } - ); + const { canceled, filePaths } = await this.dialogService.showOpenDialog({ + title: nls.localize( + 'arduino/selectZip', + "Select a zip file containing the library you'd like to add" + ), + defaultPath, + properties: ['openFile'], + filters: [ + { + name: nls.localize('arduino/library/zipLibrary', 'Library'), + extensions: ['zip'], + }, + ], + }); if (!canceled && filePaths.length) { const zipUri = await this.fileSystemExt.getUri(filePaths[0]); try { diff --git a/arduino-ide-extension/src/browser/contributions/archive-sketch.ts b/arduino-ide-extension/src/browser/contributions/archive-sketch.ts index 1f69bb3da..f49f85caf 100644 --- a/arduino-ide-extension/src/browser/contributions/archive-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/archive-sketch.ts @@ -1,6 +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 dateFormat from 'dateformat'; import { ArduinoMenus } from '../menu/arduino-menus'; import { SketchContribution, @@ -39,16 +38,13 @@ export class ArchiveSketch extends SketchContribution { const defaultContainerUri = await this.defaultUri(); const defaultUri = defaultContainerUri.resolve(archiveBasename); const defaultPath = await this.fileService.fsPath(defaultUri); - const { filePath, canceled } = await remote.dialog.showSaveDialog( - remote.getCurrentWindow(), - { - title: nls.localize( - 'arduino/sketch/saveSketchAs', - 'Save sketch folder as...' - ), - defaultPath, - } - ); + const { filePath, canceled } = await this.dialogService.showSaveDialog({ + title: nls.localize( + 'arduino/sketch/saveSketchAs', + 'Save sketch folder as...' + ), + defaultPath, + }); if (!filePath || canceled) { return; } diff --git a/arduino-ide-extension/src/browser/contributions/board-selection.ts b/arduino-ide-extension/src/browser/contributions/board-selection.ts index 5b7c11209..ddeda87bc 100644 --- a/arduino-ide-extension/src/browser/contributions/board-selection.ts +++ b/arduino-ide-extension/src/browser/contributions/board-selection.ts @@ -1,58 +1,58 @@ -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 { 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 { BoardsServiceProvider } from '../boards/boards-service-provider'; import { ArduinoMenus, PlaceholderMenuNode, unregisterSubmenu, } from '../menu/arduino-menus'; -import { - BoardsService, - InstalledBoardWithPackage, - AvailablePorts, - Port, - getBoardInfo, -} 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(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 boardInfo = await getBoardInfo( - this.boardsServiceProvider.boardsConfig.selectedPort, - this.boardsService.getState() + this.boardsServiceProvider.boardList ); if (typeof boardInfo === 'string') { this.messageService.info(boardInfo); @@ -65,7 +65,7 @@ VID: ${VID} PID: ${PID} SN: ${SN} `.trim(); - await remote.dialog.showMessageBox(remote.getCurrentWindow(), { + await this.dialogService.showMessageBox({ message: nls.localize('arduino/board/boardInfo', 'Board Info'), title: nls.localize('arduino/board/boardInfo', 'Board Info'), type: 'info', @@ -77,34 +77,35 @@ SN: ${SN} } 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(); @@ -113,7 +114,8 @@ SN: ${SN} ...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( @@ -133,7 +135,7 @@ SN: ${SN} // Ports submenu const portsSubmenuPath = ArduinoMenus.TOOLS__PORTS_SUBMENU; - const portsSubmenuLabel = config.selectedPort?.address; + const portsSubmenuLabel = selectedPort?.address; this.menuModelRegistry.registerSubmenu( portsSubmenuPath, nls.localize( @@ -172,69 +174,116 @@ SN: ${SN} label: `${BoardsListWidget.WIDGET_LABEL}...`, }); - // Installed boards - installedBoards.forEach((board, index) => { - const { packageId, packageName, fqbn, name, manuallyInstalled } = board; + 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 } = 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, - 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. - }); + // 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; } @@ -259,46 +308,26 @@ SN: ${SN} ) ); - // 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, @@ -315,22 +344,12 @@ SN: ${SN} } }; - 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(); } 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 72% 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 23b1e2504..d9fe0ae7e 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 - ) - ); + override onStart(): void { this.boardsDataStore.onChanged(() => 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) { @@ -172,7 +171,7 @@ export class BoardsDataMenuUpdater implements FrontendApplicationContribution { ]); } } - this.mainMenuManager.update(); + this.menuManager.update(); } } }); diff --git a/arduino-ide-extension/src/browser/contributions/close.ts b/arduino-ide-extension/src/browser/contributions/close.ts index b6d8f91ec..c5bab561f 100644 --- a/arduino-ide-extension/src/browser/contributions/close.ts +++ b/arduino-ide-extension/src/browser/contributions/close.ts @@ -1,26 +1,26 @@ -import { injectable } from '@theia/core/shared/inversify'; -import { toArray } from '@theia/core/shared/@phosphor/algorithm'; -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; -import type { MaybePromise } from '@theia/core/lib/common/types'; +import { Dialog } from '@theia/core/lib/browser/dialogs'; 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 { 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 { inject, injectable } from '@theia/core/shared/inversify'; +import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; 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 '../sketches-service-client-impl'; import { SaveAsSketch } from './save-as-sketch'; /** @@ -28,6 +28,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 +59,7 @@ export class Close extends SketchContribution { } } } - return remote.getCurrentWindow().close(); + return this.windowServiceExt.close(); }, }); } @@ -150,26 +153,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; diff --git a/arduino-ide-extension/src/browser/contributions/contribution.ts b/arduino-ide-extension/src/browser/contributions/contribution.ts index b34f3ee4e..8de4d8ff4 100644 --- a/arduino-ide-extension/src/browser/contributions/contribution.ts +++ b/arduino-ide-extension/src/browser/contributions/contribution.ts @@ -67,6 +67,8 @@ import { WorkspaceService } from '../theia/workspace/workspace-service'; import { MainMenuManager } from '../../common/main-menu-manager'; import { ConfigServiceClient } from '../config/config-service-client'; import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell'; +import { DialogService } from '../dialog-service'; +import { ApplicationConnectionStatusContribution } from '../theia/core/connection-status-service'; export { Command, @@ -115,6 +117,9 @@ export abstract class Contribution @inject(MainMenuManager) protected readonly menuManager: MainMenuManager; + @inject(DialogService) + protected readonly dialogService: DialogService; + @postConstruct() protected init(): void { this.appStateService.reachedState('ready').then(() => this.onReady()); @@ -168,6 +173,9 @@ export abstract class SketchContribution extends Contribution { @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(); diff --git a/arduino-ide-extension/src/browser/contributions/debug.ts b/arduino-ide-extension/src/browser/contributions/debug.ts index f43f00426..ee07d7aa5 100644 --- a/arduino-ide-extension/src/browser/contributions/debug.ts +++ b/arduino-ide-extension/src/browser/contributions/debug.ts @@ -5,8 +5,10 @@ import { ArduinoToolbar } from '../toolbar/arduino-toolbar'; import { NotificationCenter } from '../notification-center'; import { Board, + BoardIdentifier, BoardsService, ExecutableService, + isBoardIdentifierChangeEvent, Sketch, } from '../../common/protocol'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; @@ -88,9 +90,11 @@ export class Debug extends SketchContribution { : Debug.Commands.START_DEBUGGING.label }`) ); - this.boardsServiceProvider.onBoardsConfigChanged(({ selectedBoard }) => - this.refreshState(selectedBoard) - ); + this.boardsServiceProvider.onBoardsConfigDidChange((event) => { + if (isBoardIdentifierChangeEvent(event)) { + this.refreshState(event.selectedBoard); + } + }); this.notificationCenter.onPlatformDidInstall(() => this.refreshState()); this.notificationCenter.onPlatformDidUninstall(() => this.refreshState()); } @@ -169,7 +173,7 @@ export class Debug extends SketchContribution { } private async startDebug( - board: Board | undefined = this.boardsServiceProvider.boardsConfig + board: BoardIdentifier | undefined = this.boardsServiceProvider.boardsConfig .selectedBoard ): Promise { if (!board) { diff --git a/arduino-ide-extension/src/browser/contributions/delete-sketch.ts b/arduino-ide-extension/src/browser/contributions/delete-sketch.ts index 98f619045..08a72f690 100644 --- a/arduino-ide-extension/src/browser/contributions/delete-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/delete-sketch.ts @@ -1,5 +1,3 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { ipcRenderer } from '@theia/core/electron-shared/electron'; 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'; @@ -10,11 +8,11 @@ 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 { SCHEDULE_DELETION_SIGNAL } from '../../electron-common/electron-messages'; 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 { /** @@ -38,6 +36,8 @@ export class DeleteSketch extends CloudSketchContribution { 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, { @@ -66,7 +66,7 @@ export class DeleteSketch extends CloudSketchContribution { } const cloudUri = this.createFeatures.cloudUri(sketch); if (willNavigateAway !== 'force') { - const { response } = await remote.dialog.showMessageBox({ + const { response } = await this.dialogService.showMessageBox({ title: nls.localizeByDefault('Delete'), type: 'question', buttons: [Dialog.CANCEL, Dialog.OK], @@ -120,7 +120,7 @@ export class DeleteSketch extends CloudSketchContribution { } private scheduleDeletion(sketch: Sketch): void { - ipcRenderer.send(SCHEDULE_DELETION_SIGNAL, sketch); + this.appService.scheduleDeletion(sketch); } private async loadSketch(uri: string): Promise { diff --git a/arduino-ide-extension/src/browser/contributions/examples.ts b/arduino-ide-extension/src/browser/contributions/examples.ts index 02c19694d..3796b7535 100644 --- a/arduino-ide-extension/src/browser/contributions/examples.ts +++ b/arduino-ide-extension/src/browser/contributions/examples.ts @@ -1,11 +1,7 @@ -import * as PQueue from 'p-queue'; +import PQueue from 'p-queue'; import { inject, injectable } from '@theia/core/shared/inversify'; import { CommandHandler, CommandService } from '@theia/core/lib/common/command'; -import { - MenuPath, - CompositeMenuNode, - SubMenuOptions, -} from '@theia/core/lib/common/menu'; +import { MenuPath, SubMenuOptions } from '@theia/core/lib/common/menu'; import { Disposable, DisposableCollection, @@ -32,6 +28,8 @@ import { CoreService, SketchesService, Sketch, + isBoardIdentifierChangeEvent, + BoardIdentifier, } from '../../common/protocol'; import { nls } from '@theia/core/lib/common/nls'; import { unregisterSubmenu } from '../menu/arduino-menus'; @@ -112,7 +110,7 @@ export abstract class Examples extends SketchContribution { protected readonly coreService: CoreService; @inject(BoardsServiceProvider) - protected readonly boardsServiceClient: BoardsServiceProvider; + protected readonly boardsServiceProvider: BoardsServiceProvider; @inject(NotificationCenter) protected readonly notificationCenter: NotificationCenter; @@ -121,12 +119,14 @@ export abstract class Examples extends SketchContribution { 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.boardsServiceClient.boardsConfig.selectedBoard, + board: this.boardsServiceProvider.boardsConfig.selectedBoard, // No force refresh. The core client was already refreshed. }) ); @@ -138,24 +138,11 @@ export abstract class Examples extends SketchContribution { } protected abstract update(options?: { - board?: Board | undefined; + 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( @@ -242,7 +229,7 @@ export abstract class Examples extends SketchContribution { protected createHandler(uri: string): CommandHandler { const forceUpdate = () => this.update({ - board: this.boardsServiceClient.boardsConfig.selectedBoard, + board: this.boardsServiceProvider.boardsConfig.selectedBoard, forceRefresh: true, }); return { @@ -323,7 +310,7 @@ export class LibraryExamples extends Examples { protected override async update( options: { board?: Board; forceRefresh?: boolean } = { - board: this.boardsServiceClient.boardsConfig.selectedBoard, + board: this.boardsServiceProvider.boardsConfig.selectedBoard, } ): Promise { const { board, forceRefresh } = options; diff --git a/arduino-ide-extension/src/browser/contributions/include-library.ts b/arduino-ide-extension/src/browser/contributions/include-library.ts index a8a2f3f4b..5d77e9ec3 100644 --- a/arduino-ide-extension/src/browser/contributions/include-library.ts +++ b/arduino-ide-extension/src/browser/contributions/include-library.ts @@ -1,4 +1,4 @@ -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'; @@ -37,7 +37,7 @@ export class IncludeLibrary extends SketchContribution { protected readonly notificationCenter: NotificationCenter; @inject(BoardsServiceProvider) - protected readonly boardsServiceClient: BoardsServiceProvider; + protected readonly boardsServiceProvider: BoardsServiceProvider; @inject(LibraryService) protected readonly libraryService: LibraryService; @@ -46,7 +46,7 @@ export class IncludeLibrary extends SketchContribution { protected readonly toDispose = new DisposableCollection(); override onStart(): void { - this.boardsServiceClient.onBoardsConfigChanged(() => + this.boardsServiceProvider.onBoardsConfigDidChange(() => this.updateMenuActions() ); this.notificationCenter.onLibraryDidInstall(() => this.updateMenuActions()); @@ -98,7 +98,7 @@ export class IncludeLibrary extends SketchContribution { 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 }))); diff --git a/arduino-ide-extension/src/browser/contributions/ino-language.ts b/arduino-ide-extension/src/browser/contributions/ino-language.ts index c5096e64f..096c27ed8 100644 --- a/arduino-ide-extension/src/browser/contributions/ino-language.ts +++ b/arduino-ide-extension/src/browser/contributions/ino-language.ts @@ -1,15 +1,19 @@ -import { DisposableCollection } from '@theia/core/lib/common/disposable'; +import { + Disposable, + DisposableCollection, +} from '@theia/core/lib/common/disposable'; import { inject, injectable } from '@theia/core/shared/inversify'; import { Mutex } from 'async-mutex'; import { ArduinoDaemon, assertSanitizedFqbn, + BoardIdentifier, BoardsService, ExecutableService, + isBoardIdentifierChangeEvent, sanitizeFqbn, } from '../../common/protocol'; import { CurrentSketch } from '../sketches-service-client-impl'; -import { BoardsConfig } from '../boards/boards-config'; import { BoardsServiceProvider } from '../boards/boards-service-provider'; import { HostedPluginEvents } from '../hosted-plugin-events'; import { NotificationCenter } from '../notification-center'; @@ -45,7 +49,7 @@ export class InoLanguage extends SketchContribution { override onReady(): void { const start = ( - { selectedBoard }: BoardsConfig.Config, + selectedBoard: BoardIdentifier | undefined, forceStart = false ) => { if (selectedBoard) { @@ -56,12 +60,16 @@ export class InoLanguage extends SketchContribution { } }; const forceRestart = () => { - start(this.boardsServiceProvider.boardsConfig, true); + start(this.boardsServiceProvider.boardsConfig.selectedBoard, true); }; this.toDispose.pushAll([ - this.boardsServiceProvider.onBoardsConfigChanged(start), + this.boardsServiceProvider.onBoardsConfigDidChange((event) => { + if (isBoardIdentifierChangeEvent(event)) { + start(event.selectedBoard); + } + }), this.hostedPluginEvents.onPluginsDidStart(() => - start(this.boardsServiceProvider.boardsConfig) + start(this.boardsServiceProvider.boardsConfig.selectedBoard) ), this.hostedPluginEvents.onPluginsWillUnload( () => (this.languageServerFqbn = undefined) @@ -98,12 +106,14 @@ export class InoLanguage extends SketchContribution { matchingFqbn && boardsConfig.selectedBoard?.fqbn === matchingFqbn ) { - start(boardsConfig); + start(boardsConfig.selectedBoard); } } }), ]); - start(this.boardsServiceProvider.boardsConfig); + this.boardsServiceProvider.ready.then(() => + start(this.boardsServiceProvider.boardsConfig.selectedBoard) + ); } onStop(): void { @@ -120,6 +130,7 @@ export class InoLanguage extends SketchContribution { return; } const release = await this.languageServerStartMutex.acquire(); + const toDisposeOnRelease = new DisposableCollection(); try { await this.hostedPluginEvents.didStart; const details = await this.boardsService.getBoardDetails({ fqbn }); @@ -179,12 +190,13 @@ 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 - ) - ), + ); + toDisposeOnRelease.push(Disposable.create(() => clearTimeout(timer))); + }), this.commandService.executeCommand( 'arduino.languageserver.start', { @@ -206,6 +218,7 @@ export class InoLanguage extends SketchContribution { console.log(`Failed to start language server. Original FQBN: ${fqbn}`, e); this.languageServerFqbn = undefined; } finally { + toDisposeOnRelease.dispose(); release(); } } diff --git a/arduino-ide-extension/src/browser/contributions/interface-scale.ts b/arduino-ide-extension/src/browser/contributions/interface-scale.ts index be862ff84..6db578f1d 100644 --- a/arduino-ide-extension/src/browser/contributions/interface-scale.ts +++ b/arduino-ide-extension/src/browser/contributions/interface-scale.ts @@ -8,7 +8,7 @@ import { import { ArduinoMenus } from '../menu/arduino-menus'; import { CommandRegistry, MaybePromise, nls } from '@theia/core/lib/common'; import { Settings } from '../dialogs/settings/settings'; -import debounce = require('lodash.debounce'); +import debounce from 'lodash.debounce'; @injectable() export class InterfaceScale extends Contribution { 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..443c3e5e4 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(params), }); } } 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 86cf971d0..e69d8b0b6 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch-files.ts @@ -118,6 +118,7 @@ export class OpenSketchFiles extends SketchContribution { fileService: this.fileService, sketchesService: this.sketchesService, labelProvider: this.labelProvider, + dialogService: this.dialogService, }); if (movedSketch) { this.workspaceService.open(new URI(movedSketch.uri), { diff --git a/arduino-ide-extension/src/browser/contributions/open-sketch.ts b/arduino-ide-extension/src/browser/contributions/open-sketch.ts index 2b8fc07c8..93f1b6108 100644 --- a/arduino-ide-extension/src/browser/contributions/open-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/open-sketch.ts @@ -1,4 +1,3 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; import { nls } from '@theia/core/lib/common/nls'; import { injectable } from '@theia/core/shared/inversify'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; @@ -18,6 +17,7 @@ import { SketchContribution, URI, } from './contribution'; +import { DialogService } from '../dialog-service'; export type SketchLocation = string | URI | SketchRef; export namespace SketchLocation { @@ -83,19 +83,16 @@ export class OpenSketch extends SketchContribution { private async selectSketch(): Promise { const defaultPath = await this.defaultPath(); - const { filePaths } = await remote.dialog.showOpenDialog( - remote.getCurrentWindow(), - { - defaultPath, - properties: ['createDirectory', 'openFile'], - filters: [ - { - name: nls.localize('arduino/sketch/sketch', 'Sketch'), - extensions: ['ino', 'pde'], - }, - ], - } - ); + const { filePaths } = await this.dialogService.showOpenDialog({ + defaultPath, + properties: ['createDirectory', 'openFile'], + filters: [ + { + name: nls.localize('arduino/sketch/sketch', 'Sketch'), + extensions: ['ino', 'pde'], + }, + ], + }); if (!filePaths.length) { return undefined; } @@ -115,6 +112,7 @@ export class OpenSketch extends SketchContribution { fileService: this.fileService, sketchesService: this.sketchesService, labelProvider: this.labelProvider, + dialogService: this.dialogService, }); } } @@ -134,14 +132,16 @@ export async function promptMoveSketch( fileService: FileService; sketchesService: SketchesService; labelProvider: LabelProvider; + dialogService: DialogService; } ): Promise { - const { fileService, sketchesService, labelProvider } = options; + 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 remote.dialog.showMessageBox({ + const { response } = await dialogService.showMessageBox({ title: nls.localize('arduino/sketch/moving', 'Moving'), type: 'question', buttons: [ @@ -160,7 +160,7 @@ export async function promptMoveSketch( const newSketchUri = uri.parent.resolve(name); const exists = await fileService.exists(newSketchUri); if (exists) { - await remote.dialog.showMessageBox({ + await dialogService.showMessageBox({ type: 'error', title: nls.localize('vscode/dialog/dialogErrorMessage', 'Error'), message: nls.localize( 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/save-as-sketch.ts b/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts index e57f16191..26dd6158f 100644 --- a/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-as-sketch.ts @@ -1,4 +1,3 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; import { Dialog } from '@theia/core/lib/browser/dialogs'; import { NavigatableWidget } from '@theia/core/lib/browser/navigatable'; import { Saveable } from '@theia/core/lib/browser/saveable'; @@ -8,7 +7,7 @@ import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; import { WorkspaceInput } from '@theia/workspace/lib/browser/workspace-service'; -import { StartupTask } from '../../electron-common/startup-task'; +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'; @@ -25,6 +24,7 @@ import { RenameCloudSketch, RenameCloudSketchParams, } from './rename-cloud-sketch'; +import { assertConnectedToBackend } from './save-sketch'; @injectable() export class SaveAsSketch extends CloudSketchContribution { @@ -65,6 +65,10 @@ export class SaveAsSketch extends CloudSketchContribution { markAsRecentlyOpened, }: SaveAsSketch.Options = SaveAsSketch.Options.DEFAULT ): Promise { + assertConnectedToBackend({ + connectionStatusService: this.connectionStatusService, + messageService: this.messageService, + }); const sketch = await this.sketchServiceClient.currentSketch(); if (!CurrentSketch.isValid(sketch)) { return false; @@ -95,7 +99,7 @@ export class SaveAsSketch extends CloudSketchContribution { if (markAsRecentlyOpened) { this.sketchesService.markAsRecentlyOpened(newWorkspaceUri); } - const options: WorkspaceInput & StartupTask.Owner = { + const options: WorkspaceInput & StartupTasks = { preserveWindow: true, tasks: [], }; @@ -165,16 +169,13 @@ export class SaveAsSketch extends CloudSketchContribution { ): Promise { let sketchFolderDestinationUri: string | undefined; while (!sketchFolderDestinationUri) { - const { filePath } = await remote.dialog.showSaveDialog( - remote.getCurrentWindow(), - { - title: nls.localize( - 'arduino/sketch/saveFolderAs', - 'Save sketch folder as...' - ), - defaultPath, - } - ); + const { filePath } = await this.dialogService.showSaveDialog({ + title: nls.localize( + 'arduino/sketch/saveFolderAs', + 'Save sketch folder as...' + ), + defaultPath, + }); if (!filePath) { return undefined; } @@ -225,13 +226,10 @@ ${dialogContent.details} ${dialogContent.question}`.trim(); defaultPath = filePath; - const { response } = await remote.dialog.showMessageBox( - remote.getCurrentWindow(), - { - message, - buttons: [Dialog.CANCEL, Dialog.YES], - } - ); + const { response } = await this.dialogService.showMessageBox({ + message, + buttons: [Dialog.CANCEL, Dialog.YES], + }); // cancel if (response === 0) { return undefined; diff --git a/arduino-ide-extension/src/browser/contributions/save-sketch.ts b/arduino-ide-extension/src/browser/contributions/save-sketch.ts index d05a47982..ac20d8aa6 100644 --- a/arduino-ide-extension/src/browser/contributions/save-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/save-sketch.ts @@ -1,16 +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 { 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 '../sketches-service-client-impl'; +import { SaveAsSketch } from './save-as-sketch'; @injectable() export class SaveSketch extends SketchContribution { @@ -36,6 +38,10 @@ 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; @@ -63,3 +69,18 @@ export namespace SaveSketch { }; } } + +// 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..8c1ad74d6 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,21 @@ 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(() => + this.update(this.boardsServiceProvider.boardList) ); } override onReady(): void { - this.update(this.boardsServiceProvider.boardsConfig); + this.update(this.boardsServiceProvider.boardList); } - private update({ selectedBoard, selectedPort }: BoardsConfig.Config): void { + private update(boardList: BoardList): void { + const { selectedBoard, selectedPort } = boardList.boardsConfig; this.statusBar.setElement('arduino-selected-board', { alignment: StatusBarAlignment.RIGHT, text: selectedBoard @@ -38,17 +41,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/startup-task.ts b/arduino-ide-extension/src/browser/contributions/startup-task.ts deleted file mode 100644 index b37b558ea..000000000 --- a/arduino-ide-extension/src/browser/contributions/startup-task.ts +++ /dev/null @@ -1,52 +0,0 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import type { IpcRendererEvent } from '@theia/core/electron-shared/electron'; -import { ipcRenderer } from '@theia/core/electron-shared/electron'; -import { injectable } from '@theia/core/shared/inversify'; -import { StartupTask } from '../../electron-common/startup-task'; -import { Contribution } from './contribution'; - -@injectable() -export class StartupTasks extends Contribution { - override onReady(): void { - ipcRenderer.once( - StartupTask.Messaging.STARTUP_TASKS_SIGNAL, - (_: IpcRendererEvent, args: unknown) => { - console.debug( - `Received the startup tasks from the electron main process. Args: ${JSON.stringify( - args - )}` - ); - if (!StartupTask.has(args)) { - console.warn(`Could not detect 'tasks' from the signal. Skipping.`); - return; - } - const tasks = args.tasks; - if (tasks.length) { - console.log(`Executing startup 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 - ) - ); - }); - } - } - ); - const { id } = remote.getCurrentWindow(); - console.debug( - `Signalling app ready event to the electron main process. Sender ID: ${id}.` - ); - ipcRenderer.send(StartupTask.Messaging.APP_READY_SIGNAL(id)); - } -} 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/update-arduino-state.ts b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts new file mode 100644 index 000000000..35b4c2ab7 --- /dev/null +++ b/arduino-ide-extension/src/browser/contributions/update-arduino-state.ts @@ -0,0 +1,176 @@ +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 { HostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin'; +import type { ArduinoState } from 'vscode-arduino-api'; +import { + BoardsService, + CompileSummary, + isCompileSummary, + BoardsConfig, + 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 { CurrentSketch } from '../sketches-service-client-impl'; +import { SketchContribution } from './contribution'; + +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; + + 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.commandService.onDidExecuteCommand(({ commandId, args }) => { + if ( + commandId === 'arduino.languageserver.notifyBuildDidComplete' && + isCompileSummary(args[0]) + ) { + this.updateCompileSummary(args[0]); + } + }), + this.boardsDataStore.onChanged((fqbn) => { + const selectedFqbn = + this.boardsServiceProvider.boardsConfig.selectedBoard?.fqbn; + if (selectedFqbn && fqbn.includes(selectedFqbn)) { + this.updateBoardDetails(selectedFqbn); + } + }), + ]); + } + + override onReady(): void { + this.updateBoardsConfig(this.boardsServiceProvider.boardsConfig); // TODO: verify! + this.updateSketchPath(this.sketchServiceClient.tryGetCurrentSketch()); + this.updateUserDirPath(this.configService.tryGetSketchDirUri()); + this.updateDataDirPath(this.configService.tryGetDataDirUri()); + } + + 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/upload-certificate.ts b/arduino-ide-extension/src/browser/contributions/upload-certificate.ts index 7e1400932..a6385cb2a 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-certificate.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-certificate.ts @@ -16,7 +16,10 @@ 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() @@ -74,12 +77,8 @@ 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); }, }); diff --git a/arduino-ide-extension/src/browser/contributions/upload-firmware.ts b/arduino-ide-extension/src/browser/contributions/upload-firmware.ts index cd6afb9cb..e01a8fb55 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-firmware.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-firmware.ts @@ -47,7 +47,7 @@ export namespace UploadFirmware { id: 'arduino-upload-firmware-open', label: nls.localize( 'arduino/firmware/updater', - 'WiFi101 / WiFiNINA 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 034ea87d3..75c591dba 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts @@ -1,30 +1,30 @@ -import { inject, injectable } from '@theia/core/shared/inversify'; import { Emitter } from '@theia/core/lib/common/event'; -import { CoreService, Port, sanitizeFqbn } from '../../common/protocol'; +import { nls } from '@theia/core/lib/common/nls'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { CoreService, sanitizeFqbn } 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 { deepClone, nls } from '@theia/core/lib/common'; -import { CurrentSketch } from '../sketches-service-client-impl'; -import type { VerifySketchParams } from './verify-sketch'; import { UserFields } from './user-fields'; +import type { VerifySketchParams } from './verify-sketch'; @injectable() export class UploadSketch extends CoreServiceContribution { + @inject(UserFields) + private readonly userFields: UserFields; + private readonly onDidChangeEmitter = new Emitter(); private readonly onDidChange = this.onDidChangeEmitter.event; private uploadInProgress = false; - @inject(UserFields) - private readonly userFields: UserFields; - override registerCommands(registry: CommandRegistry): void { registry.registerCommand(UploadSketch.Commands.UPLOAD_SKETCH, { execute: async () => { @@ -107,7 +107,6 @@ export class UploadSketch extends CoreServiceContribution { // uploadInProgress will be set to false whether the upload fails or not this.uploadInProgress = true; this.menuManager.update(); - this.boardsServiceProvider.snapshotBoardDiscoveryOnUpload(); this.onDidChangeEmitter.fire(); this.clearVisibleNotification(); @@ -135,12 +134,14 @@ export class UploadSketch extends CoreServiceContribution { return; } - await this.doWithProgress({ + const uploadResponse = await this.doWithProgress({ progressText: nls.localize('arduino/sketch/uploading', 'Uploading...'), task: (progressId, coreService) => coreService.upload({ ...uploadOptions, progressId }), keepOutput: true, }); + // the port update is NOOP if nothing has changed + this.boardsServiceProvider.updateConfig(uploadResponse.portAfterUpload); this.messageService.info( nls.localize('arduino/sketch/doneUploading', 'Done uploading.'), @@ -150,9 +151,10 @@ export class UploadSketch extends CoreServiceContribution { 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.menuManager.update(); - this.boardsServiceProvider.attemptPostUploadAutoSelect(); this.onDidChangeEmitter.fire(); } } @@ -174,7 +176,7 @@ export class UploadSketch extends CoreServiceContribution { 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, @@ -185,28 +187,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; - } } export namespace UploadSketch { diff --git a/arduino-ide-extension/src/browser/contributions/user-fields.ts b/arduino-ide-extension/src/browser/contributions/user-fields.ts index 62bef9748..14a4e55a8 100644 --- a/arduino-ide-extension/src/browser/contributions/user-fields.ts +++ b/arduino-ide-extension/src/browser/contributions/user-fields.ts @@ -21,7 +21,7 @@ export class UserFields extends Contribution { protected override init(): void { super.init(); - this.boardsServiceProvider.onBoardsConfigChanged(async () => { + this.boardsServiceProvider.onBoardsConfigDidChange(async () => { const userFields = await this.boardsServiceProvider.selectedBoardUserFields(); this.boardRequiresUserFields = userFields.length > 0; @@ -43,10 +43,7 @@ export class UserFields extends Contribution { if (!fqbn) { return undefined; } - const address = - boardsConfig.selectedBoard?.port?.address || - boardsConfig.selectedPort?.address || - ''; + const address = boardsConfig.selectedPort?.address || ''; return fqbn + '|' + address; } diff --git a/arduino-ide-extension/src/browser/contributions/validate-sketch.ts b/arduino-ide-extension/src/browser/contributions/validate-sketch.ts index 16b29929a..fb7de55f1 100644 --- a/arduino-ide-extension/src/browser/contributions/validate-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/validate-sketch.ts @@ -1,4 +1,3 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; 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'; @@ -180,15 +179,12 @@ export class ValidateSketch extends CloudSketchContribution { message: string, buttons: string[] = [Dialog.CANCEL, Dialog.OK] ): Promise { - const { response } = await remote.dialog.showMessageBox( - remote.getCurrentWindow(), - { - title, - message, - type: 'warning', - buttons, - } - ); + const { response } = await this.dialogService.showMessageBox({ + title, + message, + type: 'warning', + buttons, + }); // cancel if (response === 0) { return false; diff --git a/arduino-ide-extension/src/browser/create/create-api.ts b/arduino-ide-extension/src/browser/create/create-api.ts index b2aac2b02..89244a427 100644 --- a/arduino-ide-extension/src/browser/create/create-api.ts +++ b/arduino-ide-extension/src/browser/create/create-api.ts @@ -86,26 +86,25 @@ export class CreateApi { 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( @@ -513,7 +512,7 @@ export class CreateApi { const result = await resultProvider(response); const parseEnd = performance.now(); console.debug( - `HTTP ${fetchCount} ${method} ${url} [fetch: ${( + `HTTP ${fetchCount} ${method}${url} [fetch: ${( fetchEnd - fetchStart ).toFixed(2)} ms, parse: ${(parseEnd - parseStart).toFixed( 2 diff --git a/arduino-ide-extension/src/browser/create/create-features.ts b/arduino-ide-extension/src/browser/create/create-features.ts index befce589d..2bbb32170 100644 --- a/arduino-ide-extension/src/browser/create/create-features.ts +++ b/arduino-ide-extension/src/browser/create/create-features.ts @@ -4,10 +4,14 @@ 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 '../../node/auth/types'; +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'; @@ -128,8 +132,8 @@ export class CreateFeatures implements FrontendApplicationContribution { return undefined; } return dataDirUri - .resolve('RemoteSketchbook') - .resolve('ArduinoCloud') + .resolve(REMOTE_SKETCHBOOK_FOLDER) + .resolve(ARDUINO_CLOUD_FOLDER) .isEqualOrParent(new URI(sketch.uri)); } 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..91e8126af 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,25 @@ 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) { + 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 +144,10 @@ export const CertificateUploaderComponent = ({
@@ -167,7 +186,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 fa18fb6f2..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; 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..1f59b5239 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,36 @@ 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 type { + BoardList, + 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 +43,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 +72,29 @@ export const SelectBoardComponent = ({ } setSelectBoardPlaceholder(placeholderTxt); - setSelectOptions(boardsList); + setSelectOptions(boardOptions); - if (selectedBoard) { - selBoard = boardsList - .map((boardOpt) => boardOpt.value) - .indexOf(selectedBoard.fqbn || ''); + if (selectedItem) { + selBoard = updatableBoards.indexOf(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" /> @@ -81,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 ( 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 index cd329369d..6674727ee 100644 --- a/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-status.tsx +++ b/arduino-ide-extension/src/browser/widgets/cloud-sketchbook/cloud-status.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +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'; 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 83b0dea71..1e13b1417 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,4 +1,4 @@ -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 type { ListItemRenderer } from './list-item-renderer'; 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 86f4d3df7..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,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +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'; 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 05e0e95be..0039d76d1 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,18 +1,25 @@ -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 { + 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 { ListWidget, UserAbortError } 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'; @@ -130,13 +137,29 @@ export class FilterableListContainer< } private async install(item: T, version: Installable.Version): Promise { - const { install, searchable } = this.props; + 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, edited: undefined }); 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 945b563dc..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 @@ -23,7 +23,7 @@ import { 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 * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { Unknown } from '../../../common/nls'; import { CoreService, 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 ca340a01f..7603f44c0 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, 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 { constructor(props: Readonly) { diff --git a/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx b/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx index d70d5b9a4..bee5792f9 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/create-new.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; export class CreateNew extends React.Component { override render(): React.ReactNode { 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 index 897ce61fb..e537b8ff4 100644 --- a/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-composite-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/sketchbook/sketchbook-composite-widget.tsx @@ -1,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +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'; 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 5d1152e21..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,4 +1,4 @@ -import * as React from '@theia/core/shared/react'; +import React from '@theia/core/shared/react'; import { inject, injectable, @@ -62,12 +62,16 @@ export class SketchbookTreeWidget extends FileTreeWidget { } @postConstruct() - protected override async init(): Promise { + 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( 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 511ac486f..e73bb7e2f 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,4 +1,3 @@ -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'; @@ -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); } } } diff --git a/arduino-ide-extension/src/common/ipc-communication.ts b/arduino-ide-extension/src/common/ipc-communication.ts deleted file mode 100644 index 826daf532..000000000 --- a/arduino-ide-extension/src/common/ipc-communication.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const SHOW_PLOTTER_WINDOW = 'SHOW_PLOTTER_WINDOW'; -export const CLOSE_PLOTTER_WINDOW = 'CLOSE_PLOTTER_WINDOW'; diff --git a/arduino-ide-extension/src/common/nls.ts b/arduino-ide-extension/src/common/nls.ts index a2e58b86a..06c8baee7 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,8 @@ export const InstallManually = nls.localize( 'arduino/common/installManually', 'Install Manually' ); + +export const serialMonitorWidgetLabel = nls.localize( + 'arduino/common/serialMonitor', + 'Serial Monitor' +); 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; + }, >{}); +} 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; flash(firmware: FirmwareInfo, port: Port): Promise; - uploadCertificates(command: string): Promise; + uploadCertificates(params: UploadCertificateParams): Promise; updatableBoards(): Promise; availableFirmwares(fqbn: string): Promise; } 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) && + (arg).boards !== undefined && + Array.isArray((arg).boards) && + Boolean((arg).boards.length) && + (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' && + (arg).port !== undefined && + Port.is((arg).port) && + ((arg).board === undefined || + ((arg).board !== undefined && + isBoardIdentifier((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) && + (arg).type !== undefined && + isInferenceType((arg).type) && + (arg).inferredBoard !== undefined && + isBoardIdentifier((arg).inferredBoard) + ); +} + +/** + * Stores historical info about boards manually specified for detected boards. The key are generated with `Port#keyOf`. + */ +export type BoardListHistory = Readonly>; + +export function isBoardListHistory(arg: unknown): arg is BoardListHistory { + return ( + Boolean(arg) && + typeof arg === 'object' && + Object.entries(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(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; + + /** + * 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> + >; + + /** + * For dumping the current state of board list for debugging purposes. + */ + toString(): string; +} + +export type SelectBoardsConfigActionParams = Readonly>; +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 = 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 +): ReturnType { + const result: Record = {}; + 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 { + 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(); + 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 = { + 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 c955b9462..c485e6704 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -1,8 +1,6 @@ -import { naturalCompare } from './../utils'; -import { Searchable } from './searchable'; -import { Installable } from './installable'; -import { ArduinoComponent } from './arduino-component'; import { nls } from '@theia/core/lib/common/nls'; +import type { MaybePromise } from '@theia/core/lib/common/types'; +import type URI from '@theia/core/lib/common/uri'; import { All, Contributed, @@ -10,131 +8,46 @@ import { Type as TypeLabel, Updatable, } from '../nls'; -import URI from '@theia/core/lib/common/uri'; -import { MaybePromise } from '@theia/core/lib/common/types'; - -export type AvailablePorts = Record]>; -export namespace AvailablePorts { - export function groupByProtocol( - availablePorts: AvailablePorts - ): Map { - const grouped = new Map(); - 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 type { Defined } from '../types'; +import { naturalCompare } from './../utils'; +import type { ArduinoComponent } from './arduino-component'; +import type { BoardList } from './board-list'; +import { Installable } from './installable'; +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[]; } -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 = ( - 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>; + +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'; @@ -152,14 +65,17 @@ export interface BoardsService */ skipPostInstall?: boolean; }): Promise; - getState(): Promise; + getDetectedPorts(): Promise; getBoardDetails(options: { fqbn: string }): Promise; - getBoardPackage(options: { id: string }): Promise; + getBoardPackage(options: { + id: string /* TODO: change to PlatformIdentifier type? */; + }): Promise; getContainerBoardPackage(options: { fqbn: string; }): Promise; searchBoards({ query }: { query?: string }): Promise; getInstalledBoards(): Promise; + getInstalledPlatforms(): Promise; getBoardUserFields(options: { fqbn: string; protocol: string; @@ -180,7 +96,7 @@ 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); @@ -252,9 +168,9 @@ export namespace Port { 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; @@ -282,10 +198,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 { @@ -297,16 +216,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( @@ -324,35 +235,28 @@ 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 - ): (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; - } - } - return false; - }; + 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 type KnownProtocol = (typeof KnownProtocolLiterals)[number]; export namespace KnownProtocol { export function is(protocol: unknown): protocol is KnownProtocol { return ( typeof protocol === 'string' && - KnownProtocolLiterals.indexOf(protocol as KnownProtocol) >= 0 + KnownProtocolLiterals.includes(protocol as KnownProtocol) ); } } @@ -377,29 +281,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; @@ -411,14 +298,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) && + (arg).packageName !== undefined && + typeof (arg).packageName === 'string' && + isPlatformIdentifier((arg).packageId) && + (arg).manuallyInstalled !== undefined && + typeof (arg).manuallyInstalled === 'boolean' + ); } } @@ -441,6 +333,7 @@ export interface BoardDetails { readonly debuggingSupported: boolean; readonly VID: string; readonly PID: string; + readonly buildProperties: string[]; } export interface Tool { @@ -455,18 +348,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. @@ -554,24 +435,15 @@ export namespace Board { return left.name === right.name && left.fqbn === right.fqbn; } - export function hardwareIdEquals(left: Board, right: Board): boolean { - if (left.port && right.port) { - const { hardwareId: leftHardwareId } = left.port; - const { hardwareId: rightHardwareId } = right.port; - - if (leftHardwareId && rightHardwareId) { - return leftHardwareId === rightHardwareId; - } - } - - return false; - } - - 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; } @@ -593,7 +465,7 @@ export namespace Board { } export function toString( - board: Board, + board: BoardIdentifier, options: { useFqbn: boolean } = { useFqbn: true } ): string { const fqbn = @@ -606,14 +478,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 ): Array { + 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(); @@ -621,21 +494,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, @@ -643,7 +537,7 @@ export namespace Board { (distinctBoardNames.get(board.name) || 0) > 1 ? ` - ${board.packageName}` : undefined, - selected: selected(board), + selected: isSelected(board), missing: !installed(board), })); } @@ -673,11 +567,267 @@ export function sanitizeFqbn(fqbn: string | undefined): string | undefined { return `${vendor}:${arch}:${id}`; } -export interface BoardConfig { - selectedBoard?: Board; - selectedPort?: Port; +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' && + (arg).vendorId !== undefined && + typeof (arg).vendorId === 'string' && + (arg).arch !== undefined && + typeof (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>; + +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' && + (arg).protocol !== undefined && + typeof (arg).protocol === 'string' && + (arg).address !== undefined && + typeof (arg).address === 'string' + ); +} + +// the smaller the number, the higher the priority +const portProtocolPriorities: Record = { + 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' && + (arg).name !== undefined && + typeof (arg).name === 'string' && + ((arg).fqbn === undefined || + ((arg).fqbn !== undefined && + typeof (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 = options.looseFqbn ? sanitizeFqbn(left.fqbn) : left.fqbn; + const rightFqbn = options.looseFqbn ? sanitizeFqbn(right.fqbn) : right.fqbn; + 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 { + 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`'. @@ -713,50 +863,57 @@ 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( - selectedPort: Port | undefined, - availablePorts: MaybePromise + boardListProvider: MaybePromise ): Promise { - if (!selectedPort) { + 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; } - const selectedPortKey = Port.keyOf(selectedPort); - const state = await availablePorts; - const boardListOnSelectedPort = Object.entries(state).filter( - ([portKey, [port]]) => - portKey === selectedPortKey && isNonNativeSerial(port) - ); - - if (!boardListOnSelectedPort.length) { + if (!isNonNativeSerial(selectedPort)) { return noNativeSerialPort; } - const [, [port, boards]] = boardListOnSelectedPort[0]; - if (boardListOnSelectedPort.length > 1 || boards.length > 1) { + if (boards && boards.length > 1) { console.warn( `Detected more than one available boards on the selected port : ${JSON.stringify( - selectedPort + detectedPort )}. Detected boards were: ${JSON.stringify( - boardListOnSelectedPort - )}. Using the first one: ${JSON.stringify([port, boards])}` + boards + )}. Using the first one: ${JSON.stringify(boards[0])}` ); } - const board = boards[0]; + const board = boards ? boards[0] : undefined; const BN = board?.name ?? unknownBoard; - const VID = readProperty('vid', port); - const PID = readProperty('pid', port); - const SN = readProperty('serialNumber', port); + const VID = readProperty('vid', selectedPort); + const PID = readProperty('pid', selectedPort); + const SN = readProperty('serialNumber', selectedPort); return { VID, PID, SN, BN }; } diff --git a/arduino-ide-extension/src/common/protocol/config-service.ts b/arduino-ide-extension/src/common/protocol/config-service.ts index 6baaf9dc4..4ec13c0da 100644 --- a/arduino-ide-extension/src/common/protocol/config-service.ts +++ b/arduino-ide-extension/src/common/protocol/config-service.ts @@ -3,7 +3,6 @@ import { RecursivePartial } from '@theia/core/lib/common/types'; export const ConfigServicePath = '/services/config-service'; export const ConfigService = Symbol('ConfigService'); export interface ConfigService { - getVersion(): Promise>; getConfiguration(): Promise; setConfiguration(config: Config): Promise; } diff --git a/arduino-ide-extension/src/common/protocol/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index 7dfcfb896..9104df01e 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -1,17 +1,15 @@ -import { nls } from '@theia/core/lib/common/nls'; import { ApplicationError } from '@theia/core/lib/common/application-error'; +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 { isPortIdentifier, PortIdentifier, Programmer } from './boards-service'; +import type { IndexUpdateSummary } from './notification-service'; import type { Sketch } from './sketches-service'; -import { IndexUpdateSummary } from './notification-service'; export const CompilerWarningLiterals = [ 'None', @@ -19,7 +17,7 @@ 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]; @@ -103,11 +101,69 @@ 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' && + (arg).buildPath !== undefined && + typeof (arg).buildPath === 'string' && + (arg).buildOutputUri !== undefined && + typeof (arg).buildOutputUri === 'string' && + (arg).executableSectionsSize !== undefined && + Array.isArray((arg).executableSectionsSize) && + (arg).usedLibraries !== undefined && + Array.isArray((arg).usedLibraries) && + (arg).buildProperties !== undefined && + Array.isArray((arg).buildProperties) + ); +} + +export interface UploadResponse { + readonly portAfterUpload: PortIdentifier; +} +export function isUploadResponse(arg: unknown): arg is UploadResponse { + return ( + Boolean(arg) && + typeof arg === 'object' && + isPortIdentifier((arg).portAfterUpload) + ); +} + export const CoreServicePath = '/services/core-service'; export const CoreService = Symbol('CoreService'); export interface CoreService { compile(options: CoreService.Options.Compile): Promise; - upload(options: CoreService.Options.Upload): Promise; + upload(options: CoreService.Options.Upload): Promise; burnBootloader(options: CoreService.Options.Bootloader): Promise; /** * Refreshes the underling core gRPC client for the Arduino CLI. @@ -132,7 +188,7 @@ export interface CoreService { } export const IndexTypeLiterals = ['platform', 'library'] as const; -export type IndexType = typeof IndexTypeLiterals[number]; +export type IndexType = (typeof IndexTypeLiterals)[number]; export namespace IndexType { export function is(arg: unknown): arg is IndexType { return ( @@ -153,7 +209,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/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/installable.ts b/arduino-ide-extension/src/common/protocol/installable.ts index 962f52aec..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 { /** * If `options.version` is specified, that will be installed. Otherwise, `item.availableVersions[0]`. @@ -35,16 +66,16 @@ 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); @@ -58,7 +89,7 @@ export namespace Installable { 'remove', 'unknown', ] as const; - export type Action = typeof ActionLiterals[number]; + export type Action = (typeof ActionLiterals)[number]; export function action(params: { installed?: Version | undefined; diff --git a/arduino-ide-extension/src/common/protocol/monitor-service.ts b/arduino-ide-extension/src/common/protocol/monitor-service.ts index 6c9bbcac9..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 { ApplicationError, Event, JsonRpcServer, nls } 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; +export interface MonitorSettings { + pluggableMonitorSettings?: PluggableMonitorSettings; + monitorUISettings?: Partial; +} export const MonitorManagerProxyFactory = Symbol('MonitorManagerProxyFactory'); export type MonitorManagerProxyFactory = () => MonitorManagerProxy; @@ -13,17 +18,20 @@ export const MonitorManagerProxy = Symbol('MonitorManagerProxy'); export interface MonitorManagerProxy extends JsonRpcServer { startMonitor( - board: Board, - port: Port, + board: BoardIdentifier, + port: PortIdentifier, settings?: PluggableMonitorSettings ): Promise; changeMonitorSettings( - board: Board, - port: Port, + board: BoardIdentifier, + port: PortIdentifier, settings: MonitorSettings ): Promise; - stopMonitor(board: Board, port: Port): Promise; - getCurrentSettings(board: Board, port: Port): Promise; + stopMonitor(board: BoardIdentifier, port: PortIdentifier): Promise; + getCurrentSettings( + board: BoardIdentifier, + port: PortIdentifier + ): Promise; } export const MonitorManagerProxyClient = Symbol('MonitorManagerProxyClient'); @@ -36,7 +44,10 @@ export interface MonitorManagerProxyClient { getWebSocketPort(): number | undefined; isWSConnected(): Promise; startMonitor(settings?: PluggableMonitorSettings): Promise; - getCurrentSettings(board: Board, port: Port): Promise; + getCurrentSettings( + board: BoardIdentifier, + port: PortIdentifier + ): Promise; send(message: string): void; changeSettings(settings: MonitorSettings): void; } @@ -93,7 +104,7 @@ export const MissingConfigurationError = declareMonitorError( ); export function createConnectionFailedError( - port: Port, + port: PortIdentifier, details?: string ): ApplicationError { const { protocol, address } = port; @@ -118,7 +129,7 @@ export function createConnectionFailedError( return ConnectionFailedError(message, { protocol, address }); } export function createNotConnectedError( - port: Port + port: PortIdentifier ): ApplicationError { const { protocol, address } = port; return NotConnectedError( @@ -132,7 +143,7 @@ export function createNotConnectedError( ); } export function createAlreadyConnectedError( - port: Port + port: PortIdentifier ): ApplicationError { const { protocol, address } = port; return AlreadyConnectedError( @@ -146,7 +157,7 @@ export function createAlreadyConnectedError( ); } export function createMissingConfigurationError( - port: Port + port: PortIdentifier ): ApplicationError { const { protocol, address } = port; return MissingConfigurationError( diff --git a/arduino-ide-extension/src/common/protocol/notification-service.ts b/arduino-ide-extension/src/common/protocol/notification-service.ts index eba8f798e..9ad5c202d 100644 --- a/arduino-ide-extension/src/common/protocol/notification-service.ts +++ b/arduino-ide-extension/src/common/protocol/notification-service.ts @@ -1,11 +1,11 @@ import type { JsonRpcServer } from '@theia/core/lib/common/messaging/proxy-factory'; import type { - AttachedBoardsChangeEvent, BoardsPackage, ConfigState, + DetectedPorts, + IndexType, ProgressMessage, Sketch, - IndexType, } from '../protocol'; import type { LibraryPackage } from './library-service'; @@ -68,7 +68,9 @@ export interface NotificationServiceClient { notifyLibraryDidUninstall(event: { item: LibraryPackage }): void; // Boards discovery - notifyAttachedBoardsDidChange(event: AttachedBoardsChangeEvent): void; + notifyDetectedPortsDidChange(event: { detectedPorts: DetectedPorts }): void; + + // Sketches notifyRecentSketchesDidChange(event: { sketches: Sketch[] }): void; } diff --git a/arduino-ide-extension/src/common/protocol/sketches-service.ts b/arduino-ide-extension/src/common/protocol/sketches-service.ts index 9364639f6..fd3d5c6a1 100644 --- a/arduino-ide-extension/src/common/protocol/sketches-service.ts +++ b/arduino-ide-extension/src/common/protocol/sketches-service.ts @@ -1,7 +1,7 @@ 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 * as dateFormat from 'dateformat'; +import dateFormat from 'dateformat'; const filenameReservedRegex = require('filename-reserved-regex'); export namespace SketchesError { 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 = { [P in keyof T]-?: RecursiveRequired; }; + +export type Defined = { + [P in keyof T]: NonNullable; +}; 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 { + 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 { + return window.electronArduino.showMessageBox(options); + } + + showOpenDialog(options: OpenDialogOptions): Promise { + return window.electronArduino.showOpenDialog(options); + } + + showSaveDialog(options: SaveDialogOptions): Promise { + 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..b70529423 --- /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 { v4 } from 'uuid'; +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 void> = new Map(); + +function convertMenu( + menu: MenuDto[] | undefined, + handlerMap: Map void> +): InternalMenuDto[] | undefined { + if (!menu) { + return undefined; + } + + return menu.map((item) => { + let nodeId = v4(); + 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 index 9ecb228ff..d594d01da 100644 --- 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 @@ -1,4 +1,3 @@ -import { webFrame } from '@theia/core/electron-shared/electron/'; import { ContextMenuAccess, coordinateFromAnchor, @@ -16,28 +15,24 @@ export class ElectronContextMenuRenderer extends TheiaElectronContextMenuRendere options: RenderContextMenuOptions ): ContextMenuAccess { if (this.useNativeStyle) { - const { menuPath, anchor, args, onHide, context } = options; + 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 zoom = webFrame.getZoomFactor(); - // TODO: Remove the offset once Electron fixes https://github.com/electron/electron/issues/31641 - const offset = process.platform === 'win32' ? 0 : 2; - // x and y values must be Ints or else there is a conversion error - menu.popup({ - x: Math.round(x * zoom) + offset, - y: Math.round(y * zoom) + offset, + 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(); - if (onHide) { - menu.once('menu-will-close', () => onHide()); - } - return new ElectronContextMenuAccess(menu); + return new ElectronContextMenuAccess(menuHandle); } else { return super.doRender(options); } 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 bcb313a6f..77fd74a68 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,4 +1,4 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; +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 { @@ -11,15 +11,19 @@ import { } 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 debounce from 'lodash.debounce'; @injectable() export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { @@ -30,7 +34,27 @@ 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.setMenuBar(); + } + 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.setMenuBar(); + }); + // #endregion Theia `postConstruct` this.appStateService.reachedState('ready').then(() => { this.appReady = true; if (this.updateWhenReady) { @@ -39,18 +63,18 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { }); } - override createElectronMenuBar(): Electron.Menu { + 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 { @@ -63,11 +87,7 @@ 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( @@ -75,35 +95,68 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { // eslint-disable-next-line @typescript-eslint/no-explicit-any args?: any[], context?: HTMLElement, + contextKeyService?: ContextMatcher, showDisabled?: boolean - ): Electron.Menu { + ): MenuDto[] { const menuModel = this.menuProvider.getMenu(menuPath); - const template = this.fillMenuTemplate([], menuModel, args, { + 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 { + 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 = FrontendApplicationConfigProvider.get().applicationName; if (!!submenu && Array.isArray(submenu)) { @@ -142,7 +195,7 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { } // eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars - protected override roleFor(id: string): ElectronMenuItemRole | undefined { + 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 @@ -151,11 +204,11 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { } protected override fillMenuTemplate( - parentItems: Electron.MenuItemConstructorOptions[], + parentItems: MenuDto[], menuModel: MenuNode, args: unknown[] | undefined, options: ElectronMenuOptions - ): Electron.MenuItemConstructorOptions[] { + ): MenuDto[] { if (menuModel instanceof PlaceholderMenuNode) { parentItems.push({ label: menuModel.label, @@ -172,24 +225,28 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { // 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: Electron.MenuItemConstructorOptions[], + parentItems: MenuDto[], menu: MenuNode, args: unknown[] = [], options: ElectronMenuOptions - ): Electron.MenuItemConstructorOptions[] { + ): MenuDto[] { const showDisabled = options?.showDisabled !== false; if ( CompoundMenuNode.is(menu) && this.visibleSubmenu(menu) && // customization for #569 and #655 - this.undefinedOrMatch(menu.when, options.context) + 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: Electron.MenuItemConstructorOptions[] = []; + const myItems: MenuDto[] = []; children.forEach((child) => this.fillMenuTemplate(myItems, child, args, options) ); @@ -236,7 +293,11 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { commandId, ...args ) || - !this.undefinedOrMatch(node.when, options.context) + !this.undefinedOrMatch( + options.contextKeyService ?? this.contextKeyService, + node.when, + options.context + ) ) { return parentItems; } @@ -258,7 +319,7 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { const accelerator = bindings[0] && this.acceleratorFor(bindings[0]); - const menuItem: Electron.MenuItemConstructorOptions = { + const menuItem: MenuDto = { id: node.id, label: node.label, type: this.commandRegistry.getToggledHandler(commandId, ...args) @@ -268,14 +329,14 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory { 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, - click: () => this.execute(commandId, args, options.rootMenuPath), + execute: () => this.execute(commandId, args, options.rootMenuPath), }; if (isOSX) { const role = this.roleFor(node.id); if (role) { menuItem.role = role; - delete menuItem.click; + delete menuItem.execute; } } parentItems.push(menuItem); 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 a306f47da..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 @@ -5,11 +5,15 @@ 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); 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 74629f297..f1f594783 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,94 +1,52 @@ -import * as remote from '@theia/core/electron-shared/@electron/remote'; -import { ipcRenderer } from '@theia/core/electron-shared/electron'; -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 { NewWindowOptions } from '@theia/core/lib/common/window'; +import type { NewWindowOptions } from '@theia/core/lib/common/window'; import { ElectronWindowService as TheiaElectronWindowService } from '@theia/core/lib/electron-browser/window/electron-window-service'; -import { RELOAD_REQUESTED_SIGNAL } from '@theia/core/lib/electron-common/messaging/electron-messages'; -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 { StartupTask } from '../../../electron-common/startup-task'; +import { + hasStartupTasks, + StartupTasks, +} from '../../../electron-common/startup-task'; @injectable() export class ElectronWindowService extends TheiaElectronWindowService implements WindowServiceExt { - @inject(ConnectionStatusService) - private readonly connectionStatusService: ConnectionStatusService; - - @inject(ElectronMainWindowServiceExt) - private readonly mainWindowServiceExt: ElectronMainWindowServiceExt; + private _isFirstWindow: Deferred | 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. + // 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, - }); - return response === 0; // 'Yes', close the window. - } - - private _firstWindow: Deferred | undefined; async isFirstWindow(): Promise { - if (this._firstWindow === undefined) { - this._firstWindow = new Deferred(); - const windowId = remote.getCurrentWindow().id; // This is expensive and synchronous so we check it once per FE. - this.mainWindowServiceExt - .isFirstWindow(windowId) - .then((firstWindow) => this._firstWindow?.resolve(firstWindow)); + if (!this._isFirstWindow) { + this._isFirstWindow = new Deferred(); + window.electronArduino + .isFirstWindow() + .then((isFirstWindow) => this._isFirstWindow?.resolve(isFirstWindow)); } - return this._firstWindow.promise; + return this._isFirstWindow.promise; } - // Overridden because the default Theia implementation destroys the additional properties of the `options` arg, such as `tasks`. + // 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?: StartupTask.Owner): void { - if (options?.tasks && options.tasks.length) { - const { tasks } = options; - ipcRenderer.send(RELOAD_REQUESTED_SIGNAL, { tasks }); + override reload(options?: StartupTasks): void { + if (hasStartupTasks(options)) { + window.electronArduino.requestReload(options); } else { - ipcRenderer.send(RELOAD_REQUESTED_SIGNAL); + window.electronTheiaCore.requestReload(); } } + + 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 { + // 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 (arg).url === 'string' && + ((arg).forceReload === undefined || + typeof (arg).forceReload === 'boolean') + ); +} + +export interface ElectronArduino { + showMessageBox(options: MessageBoxOptions): Promise; + showOpenDialog(options: OpenDialogOptions): Promise; + showSaveDialog(options: SaveDialogOptions): Promise; + appInfo(): Promise; + quitApp(): void; + isFirstWindow(): Promise; + 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; -} diff --git a/arduino-ide-extension/src/electron-common/electron-messages.ts b/arduino-ide-extension/src/electron-common/electron-messages.ts deleted file mode 100644 index b17f85333..000000000 --- a/arduino-ide-extension/src/electron-common/electron-messages.ts +++ /dev/null @@ -1 +0,0 @@ -export const SCHEDULE_DELETION_SIGNAL = 'arduino/scheduleDeletion'; diff --git a/arduino-ide-extension/src/electron-common/startup-task.ts b/arduino-ide-extension/src/electron-common/startup-task.ts index 1bde3673d..7012e216f 100644 --- a/arduino-ide-extension/src/electron-common/startup-task.ts +++ b/arduino-ide-extension/src/electron-common/startup-task.ts @@ -1,50 +1,46 @@ +export const StartupTaskProvider = Symbol('StartupTaskProvider'); +export interface StartupTaskProvider { + tasks(): StartupTask[]; +} + export interface StartupTask { - command: string; + 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 - args?: any[]; + readonly args?: any[]; } -export namespace StartupTask { - export function is(arg: unknown): arg is StartupTask { - 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' && - (!('args' in object) || Array.isArray(object['args'])) - ); - } - return false; - } - export function has(arg: unknown): arg is unknown & Owner { - if (typeof arg === 'object') { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const object = arg as any; + +export interface StartupTasks { + readonly tasks: StartupTask[]; +} + +export function isStartupTask(arg: unknown): arg is StartupTask { + if (typeof arg === 'object') { + if ( + (arg).command !== undefined && + typeof (arg).command === 'string' + ) { return ( - 'tasks' in object && - Array.isArray(object['tasks']) && - object['tasks'].every(is) + (arg).args === undefined || + ((arg).args !== undefined && + Array.isArray((arg).args)) ); } - return false; - } - export namespace Messaging { - export const STARTUP_TASKS_SIGNAL = 'arduino/startupTasks'; - export function APP_READY_SIGNAL(id: number): string { - return `arduino/appReady${id}`; - } - } - - export interface Owner { - readonly tasks: StartupTask[]; } + return false; } -export const StartupTaskProvider = Symbol('StartupTaskProvider'); -export interface StartupTaskProvider { - tasks(): StartupTask[]; +export function hasStartupTasks(arg: unknown): arg is unknown & StartupTasks { + if (typeof arg === 'object') { + return ( + (arg).tasks !== undefined && + Array.isArray((arg).tasks) && + Boolean((arg).tasks.length) && + (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 a79385597..04f8b50fa 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,11 +1,11 @@ import { JsonRpcConnectionHandler } 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, } from '@theia/core/lib/electron-main/electron-main-application'; -import { ElectronMessagingContribution as TheiaElectronMessagingContribution } from '@theia/core/lib/electron-main/messaging/electron-messaging-contribution'; import { TheiaElectronWindow as DefaultTheiaElectronWindow } from '@theia/core/lib/electron-main/theia-electron-window'; import { ContainerModule } from '@theia/core/shared/inversify'; import { @@ -13,12 +13,13 @@ import { IDEUpdaterClient, IDEUpdaterPath, } from '../common/protocol/ide-updater'; -import { electronMainWindowServiceExtPath } from '../electron-common/electron-main-window-service-ext'; import { IsTempSketch } from '../node/is-temp-sketch'; +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 { ElectronMessagingContribution } from './theia/electron-messaging-contribution'; +import { TheiaMainApiFixFalsyHandlerId } from './theia/theia-api-main'; import { TheiaElectronWindow } from './theia/theia-electron-window'; export default new ContainerModule((bind, unbind, isBound, rebind) => { @@ -50,20 +51,16 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(TheiaElectronWindow).toSelf(); rebind(DefaultTheiaElectronWindow).toService(TheiaElectronWindow); - bind(ElectronConnectionHandler) - .toDynamicValue( - (context) => - new JsonRpcConnectionHandler(electronMainWindowServiceExtPath, () => - context.container.get(ElectronMainWindowServiceImpl) - ) - ) - .inSingletonScope(); - bind(IsTempSketch).toSelf().inSingletonScope(); - // Fix for cannot reload window: https://github.com/eclipse-theia/theia/issues/11600 - bind(ElectronMessagingContribution).toSelf().inSingletonScope(); - rebind(TheiaElectronMessagingContribution).toService( - ElectronMessagingContribution - ); + 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 => { + 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( + ipcMain, + channel, + (event, ...args) => { + if (webContents.id === event.sender.id) { + handler(...args); + } + } + ); + } +} 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 84736969e..9cb5f74e4 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 @@ -6,13 +6,14 @@ import { ipcMain, Event as ElectronEvent, } from '@theia/core/electron-shared/electron'; -import { fork } from 'child_process'; -import { AddressInfo } from 'net'; -import { join, isAbsolute, resolve } from 'path'; -import { promises as fs, rm, rmSync } from 'fs'; -import { MaybePromise } from '@theia/core/lib/common/types'; +import { fork } from 'node:child_process'; +import { AddressInfo } from 'node:net'; +import { join, isAbsolute, resolve } from 'node:path'; +import { promises as fs, rm, rmSync } from 'node:fs'; +import type { 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 { environment } from '@theia/application-package/lib/environment'; import { ElectronMainApplication as TheiaElectronMainApplication, ElectronMainExecutionParams, @@ -20,22 +21,24 @@ import { 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 { IsTempSketch } from '../../node/is-temp-sketch'; -import { - CLOSE_PLOTTER_WINDOW, - SHOW_PLOTTER_WINDOW, -} from '../../common/ipc-communication'; import { ErrnoException } from '../../node/utils/errors'; import { isAccessibleSketchPath } from '../../node/sketches-service-impl'; -import { SCHEDULE_DELETION_SIGNAL } from '../../electron-common/electron-messages'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; import { Sketch } from '../../common/protocol'; +import { + AppInfo, + appInfoPropertyLiterals, + CHANNEL_PLOTTER_WINDOW_DID_CLOSE, + CHANNEL_SCHEDULE_DELETION, + CHANNEL_SHOW_PLOTTER_WINDOW, + isShowPlotterWindowParams, +} from '../../electron-common/electron-arduino'; app.commandLine.appendSwitch('disable-http-cache'); @@ -72,6 +75,11 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { 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. @@ -111,7 +119,8 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { const cwd = process.cwd(); this.attachFileAssociations(cwd); this.useNativeWindowFrame = this.getTitleBarStyle(config) === 'native'; - this._config = config; + this._config = await updateFrontendApplicationConfigFromPackageJson(config); + this._appInfo = updateAppInfo(this._appInfo, this._config); this.hookApplicationEvents(); const [port] = await Promise.all([this.startBackend(), app.whenReady()]); this.startContentTracing(); @@ -340,17 +349,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(Restart, ({ sender }) => { - this.restart(sender.id); - }); - ipcMain.on(SCHEDULE_DELETION_SIGNAL, (event, sketch: unknown) => { + 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(); + 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; + } + + 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: { + 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( @@ -391,40 +456,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); - - const showPlotterWindow = () => { - event.newGuest?.show(); - }; - ipcMain.on(SHOW_PLOTTER_WINDOW, showPlotterWindow); - event.newGuest.setMenu(null); - event.newGuest.on('closed', () => { - ipcMain.removeListener(SHOW_PLOTTER_WINDOW, showPlotterWindow); - electronWindow.webContents.send(CLOSE_PLOTTER_WINDOW); - }); - event.newGuest.loadURL(url); - } - } - ); this.attachClosedWorkspace(electronWindow); + this.attachClosePlotterWindow(electronWindow); } protected override async startBackend(): Promise { @@ -525,6 +558,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; @@ -563,6 +603,16 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { 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); } @@ -574,6 +624,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { return this._firstWindowId; } + get appInfo(): AppInfo { + return this._appInfo; + } + private async delete(sketch: Sketch): Promise { const sketchPath = FileUri.fsPath(sketch.uri); const disposable = Disposable.create(() => { @@ -636,3 +690,90 @@ class InterruptWorkspaceRestoreError extends Error { 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: FrontendApplicationConfig +): Promise { + if (environment.electron.isDevMode()) { + console.debug( + 'Skipping frontend application configuration customizations. Running in dev mode.' + ); + return config; + } + try { + const modulePath = __filename; + // must go from `./lib/backend/electron-main.js` to `./package.json` when the app is webpacked. + const packageJsonPath = join(modulePath, '..', '..', '..', 'package.json'); + console.debug( + `Checking for frontend application configuration customizations. Module path: ${modulePath}, 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 = + 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; +} + +/** + * Mutates the `toUpdate` argument and returns with it. + */ +function updateAppInfo( + toUpdate: Mutable, + updateWith: Record +): AppInfo { + appInfoPropertyLiterals.forEach((property) => { + const newValue = updateWith[property]; + if (typeof newValue === 'string') { + toUpdate[property] = newValue; + } + }); + return toUpdate; +} 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 d26055dec..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,24 +1,16 @@ import type { NewWindowOptions } from '@theia/core/lib/common/window'; -import type { BrowserWindow } from '@theia/core/electron-shared/electron'; import { ElectronMainWindowServiceImpl as TheiaElectronMainWindowService } from '@theia/core/lib/electron-main/electron-main-window-service-impl'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { ElectronMainWindowServiceExt } from '../../electron-common/electron-main-window-service-ext'; -import { StartupTask } from '../../electron-common/startup-task'; +import { hasStartupTasks } from '../../electron-common/startup-task'; +import { ElectronArduinoRenderer } from '../electron-arduino'; import { ElectronMainApplication } from './electron-main-application'; -import { load } from './window'; +import { TheiaRendererAPI } from '@theia/core/lib/electron-main/electron-api-main'; @injectable() -export class ElectronMainWindowServiceImpl - extends TheiaElectronMainWindowService - implements ElectronMainWindowServiceExt -{ +export class ElectronMainWindowServiceImpl extends TheiaElectronMainWindowService { @inject(ElectronMainApplication) protected override readonly app: ElectronMainApplication; - async isFirstWindow(windowId: number): Promise { - return this.app.firstWindowId === windowId; - } - override openNewWindow(url: string, options: NewWindowOptions): undefined { // External window has highest precedence. if (options?.external) { @@ -34,30 +26,25 @@ export class ElectronMainWindowServiceImpl return undefined; } - // Create new window and share the startup tasks. - if (StartupTask.has(options)) { - const { tasks } = options; - this.app.createWindow().then((electronWindow) => { - this.loadURL(electronWindow, url).then(() => { - electronWindow.webContents.send( - StartupTask.Messaging.STARTUP_TASKS_SIGNAL, - { tasks } - ); - }); - }); - return undefined; - } - // Default. - return super.openNewWindow(url, options); - } + if (!hasStartupTasks(options)) { + return super.openNewWindow(url, options); + } - private loadURL( - electronWindow: BrowserWindow, - url: string - ): Promise { - return load(electronWindow, (electronWindow) => - electronWindow.loadURL(url) - ); + // 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/electron-messaging-contribution.ts b/arduino-ide-extension/src/electron-main/theia/electron-messaging-contribution.ts deleted file mode 100644 index 94924f35f..000000000 --- a/arduino-ide-extension/src/electron-main/theia/electron-messaging-contribution.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { ChannelMultiplexer } from '@theia/core/lib/common/message-rpc/channel'; -import { - ElectronMessagingContribution as TheiaElectronMessagingContribution, - ElectronWebContentChannel, -} from '@theia/core/lib/electron-main/messaging/electron-messaging-contribution'; -import { injectable } from '@theia/core/shared/inversify'; - -// Electron window cannot reload: https://github.com/eclipse-theia/theia/issues/11600 -// This patch fixes it by removing the channel multiplexer from the cache. -// A related PR in Theia: https://github.com/eclipse-theia/theia/pull/11810 -@injectable() -export class ElectronMessagingContribution extends TheiaElectronMessagingContribution { - // Based on: https://github.com/kittaakos/theia/commit/12dd318df589f1c48de2b58545912d8385919b22 - protected override createWindowChannelData(sender: Electron.WebContents): { - channel: ElectronWebContentChannel; - multiplexer: ChannelMultiplexer; - } { - const mainChannel = this.createWindowMainChannel(sender); - const multiplexer = new ChannelMultiplexer(mainChannel); - multiplexer.onDidOpenChannel((openEvent) => { - const { channel, id } = openEvent; - if (this.channelHandlers.route(id, channel)) { - console.debug(`Opening channel for service path '${id}'.`); - channel.onClose(() => - console.debug(`Closing channel on service path '${id}'.`) - ); - } - }); - - // When refreshing the browser window. - sender.once('did-navigate', () => { - multiplexer.onUnderlyingChannelClose({ reason: 'Window was refreshed' }); - this.windowChannelMultiplexer.delete(sender.id); - }); - // When closing the browser window. - sender.once('destroyed', () => { - multiplexer.onUnderlyingChannelClose({ reason: 'Window was closed' }); - this.windowChannelMultiplexer.delete(sender.id); - }); - const data = { channel: mainChannel, multiplexer }; - this.windowChannelMultiplexer.set(sender.id, data); - return data; - } -} 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 7a4bac484..ab2843550 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,52 +1,37 @@ -import { - RELOAD_REQUESTED_SIGNAL, - StopReason, -} from '@theia/core/lib/electron-common/messaging/electron-messages'; -import { createDisposableListener } from '@theia/core/lib/electron-main/event-utils'; +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 { injectable } from '@theia/core/shared/inversify'; -import { ipcMain, IpcMainEvent } from '@theia/electron/shared/electron'; -import { StartupTask } from '../../electron-common/startup-task'; -import { load } from './window'; +import { hasStartupTasks } from '../../electron-common/startup-task'; +import { ElectronArduinoRenderer } from '../electron-arduino'; @injectable() export class TheiaElectronWindow extends DefaultTheiaElectronWindow { - protected override reload(tasks?: StartupTask[]): void { + protected override reload(args?: unknown): void { this.handleStopRequest(() => { this.applicationState = 'init'; - if (tasks && tasks.length) { - load(this._window, (electronWindow) => electronWindow.reload()).then( - (electronWindow) => - electronWindow.webContents.send( - StartupTask.Messaging.STARTUP_TASKS_SIGNAL, - { tasks } - ) + if (hasStartupTasks(args)) { + const { webContents } = this._window; + const toDisposeOnReady = TheiaRendererAPI.onApplicationStateChanged( + webContents, + (state) => { + if (state === 'ready') { + ElectronArduinoRenderer.sendStartupTasks(webContents, args); + toDisposeOnReady.dispose(); + } + } ); - } else { - this._window.reload(); } + this._window.reload(); }, StopReason.Reload); } protected override attachReloadListener(): void { - createDisposableListener( - ipcMain, - RELOAD_REQUESTED_SIGNAL, - (e: IpcMainEvent, arg: unknown) => { - if (this.isSender(e)) { - if (StartupTask.has(arg)) { - this.reload(arg.tasks); - } else { - this.reload(); - } - } - }, - this.toDispose + this.toDispose.push( + ElectronArduinoRenderer.onRequestReload( + this.window.webContents, + (args?: unknown) => this.reload(args) + ) ); } - - // https://github.com/eclipse-theia/theia/issues/11600#issuecomment-1240657481 - protected override isSender(e: IpcMainEvent): boolean { - return e.sender.id === this._window.webContents.id; - } } diff --git a/arduino-ide-extension/src/electron-main/theia/window.ts b/arduino-ide-extension/src/electron-main/theia/window.ts deleted file mode 100644 index 8eac41f51..000000000 --- a/arduino-ide-extension/src/electron-main/theia/window.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { MaybePromise } from '@theia/core'; -import type { IpcMainEvent } from '@theia/core/electron-shared/electron'; -import { BrowserWindow, ipcMain } from '@theia/core/electron-shared/electron'; -import { DisposableCollection } from '@theia/core/lib/common/disposable'; -import { createDisposableListener } from '@theia/core/lib/electron-main/event-utils'; -import { StartupTask } from '../../electron-common/startup-task'; - -/** - * Should be used to load (URL) or reload a window. The returning promise will resolve - * when the app is ready to receive startup tasks. - */ -export async function load( - electronWindow: BrowserWindow, - doLoad: (electronWindow: BrowserWindow) => MaybePromise -): Promise { - const { id } = electronWindow; - const toDispose = new DisposableCollection(); - const channel = StartupTask.Messaging.APP_READY_SIGNAL(id); - return new Promise((resolve, reject) => { - toDispose.push( - createDisposableListener( - ipcMain, - channel, - ({ sender: webContents }: IpcMainEvent) => { - if (webContents.id === electronWindow.webContents.id) { - resolve(electronWindow); - } - } - ) - ); - Promise.resolve(doLoad(electronWindow)).catch(reject); - }).finally(() => toDispose.dispose()); -} diff --git a/arduino-ide-extension/src/node/arduino-daemon-impl.ts b/arduino-ide-extension/src/node/arduino-daemon-impl.ts index 327544555..16db90631 100644 --- a/arduino-ide-extension/src/node/arduino-daemon-impl.ts +++ b/arduino-ide-extension/src/node/arduino-daemon-impl.ts @@ -1,6 +1,6 @@ -import { join } from 'path'; +import { join } from 'node:path'; import { inject, injectable, named } from '@theia/core/shared/inversify'; -import { spawn, ChildProcess } from 'child_process'; +import { spawn, ChildProcess } from 'node:child_process'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { ILogger } from '@theia/core/lib/common/logger'; import { Deferred, retry } from '@theia/core/lib/common/promise-util'; @@ -9,13 +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 } 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 @@ -34,13 +35,15 @@ export class ArduinoDaemonImpl @inject(SettingsReader) private readonly settingsReader: SettingsReader; + @inject(ProcessUtils) + private readonly processUtils: ProcessUtils; + private readonly toDispose = new DisposableCollection(); private readonly onDaemonStartedEmitter = new Emitter(); private readonly onDaemonStoppedEmitter = new Emitter(); private _running = false; private _port = new Deferred(); - private _execPath: string | undefined; // Backend application lifecycle. @@ -64,28 +67,20 @@ export class ArduinoDaemonImpl async start(): Promise { 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.'); @@ -120,12 +115,8 @@ export class ArduinoDaemonImpl return this.onDaemonStoppedEmitter.event; } - async getExecPath(): Promise { - if (this._execPath) { - return this._execPath; - } - this._execPath = await getExecPath('arduino-cli', this.onError.bind(this)); - return this._execPath; + getExecPath(): string { + return arduinoCliPath; } protected async getSpawnArgs(): Promise { @@ -139,7 +130,7 @@ export class ArduinoDaemonImpl '--port', '0', '--config-file', - `"${cliConfigPath}"`, + cliConfigPath, '-v', ]; if (debug) { @@ -161,13 +152,13 @@ export class ArduinoDaemonImpl daemon: ChildProcess; port: string; }> { - const [cliPath, args] = await Promise.all([ - this.getExecPath(), - this.getSpawnArgs(), - ]); + const args = await this.getSpawnArgs(); + const cliPath = this.getExecPath(); const ready = new Deferred<{ daemon: ChildProcess; port: string }>(); - const options = { shell: true }; - const daemon = spawn(`"${cliPath}"`, args, options); + 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. @@ -253,7 +244,7 @@ export class ArduinoDaemonImpl } 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 { - if (this._execPath) { - return this._execPath; - } - this._execPath = await getExecPath('arduino-fwuploader'); - return this._execPath; - } + private readonly monitorManager: MonitorManager; - async runCommand(args: string[]): Promise { - const execPath = await this.getExecPath(); - return await spawnCommand(`"${execPath}"`, args, this.onError.bind(this)); - } - - async uploadCertificates(command: string): Promise { - return await this.runCommand(['certificates', 'flash', command]); + async uploadCertificates(params: UploadCertificateParams): Promise { + 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 { @@ -70,14 +58,13 @@ export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { } async flash(firmware: FirmwareInfo, port: Port): Promise { - 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 { + 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 5cd81f7c3..02d534044 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -41,7 +41,10 @@ import { } 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, @@ -108,7 +111,7 @@ import { SurveyNotificationServicePath, } from '../common/protocol/survey-service'; import { IsTempSketch } from './is-temp-sketch'; -import { rebindNsfwFileSystemWatcher } from './theia/filesystem/nsfw-watcher/nsfw-bindings'; +import { rebindNsfwFileSystemWatcher } from './theia/filesystem/nsfw-bindings'; import { MessagingContribution } from './theia/core/messaging-contribution'; import { MessagingService } from '@theia/core/lib/node/messaging/messaging-service'; import { HostedPluginReader } from './theia/plugin-ext/plugin-reader'; @@ -236,6 +239,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); 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..5d593166d 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 @@ -59,7 +59,7 @@ export async function startServer(server: http.Server): Promise { 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 { 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; readonly removed?: ReadonlyArray; 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 8699b7232..3ca946e0b 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 { ClientDuplexStream } 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 { inject, injectable, named } from '@theia/core/shared/inversify'; -import { Disposable } from '@theia/core/lib/common/disposable'; +import { isDeepStrictEqual } from 'util'; import { v4 } from 'uuid'; import { Unknown } from '../common/nls'; import { - AttachedBoardsChangeEvent, - AvailablePorts, Board, + DetectedPort, + DetectedPorts, NotificationServiceServer, Port, } from '../common/protocol'; @@ -22,7 +26,7 @@ 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'; @@ -57,23 +61,9 @@ export class BoardDiscovery private readonly onStreamDidCancelEmitter = new Emitter(); // 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 { @@ -120,10 +110,6 @@ export class BoardDiscovery }); } - setUploadInProgress(uploadInProgress: boolean): void { - this.uploadInProgress = uploadInProgress; - } - private createTimeout( after: number, onTimeout: (error: Error) => void @@ -202,18 +188,6 @@ export class BoardDiscovery return wrapper; } - private toJson(arg: BoardListWatchRequest | BoardListWatchResponse): string { - let object: Record | 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 { this.logger.info('start'); if (this.stopping) { @@ -240,9 +214,8 @@ export class BoardDiscovery 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) { @@ -251,69 +224,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 { @@ -322,15 +262,55 @@ export class BoardDiscovery }; } - private fromRpcPort(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(), - }; + 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 { + const newState = deepClone(prevState); + for (const { detectedPort, eventType } of events) { + const { port, boards } = detectedPort; + const key = Port.keyOf(port); + if (eventType === EventType.Add) { + const alreadyDetectedPort = newState[key]; + if (alreadyDetectedPort) { + console.warn( + `Detected a new port that has been already discovered. The old value will be overridden. Old value: ${JSON.stringify( + alreadyDetectedPort + )}, new value: ${JSON.stringify(detectedPort)}` + ); + } + newState[key] = { port, boards }; + } else if (eventType === EventType.Remove) { + const alreadyDetectedPort = newState[key]; + if (!alreadyDetectedPort) { + console.warn( + `Detected a port removal but it has not been discovered. This is most likely a bug! Detected port was: ${JSON.stringify( + detectedPort + )}` + ); + } + delete newState[key]; + } + } + return newState; } } @@ -357,7 +337,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 b336d04c4..80f1446e0 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -12,12 +12,15 @@ import { Programmer, ResponseService, NotificationServiceServer, - AvailablePorts, + DetectedPorts, BoardWithPackage, BoardUserField, BoardSearch, sortComponents, SortGroup, + platformInstallFailed, + createPlatformIdentifier, + platformIdentifierEquals, } from '../common/protocol'; import { PlatformInstallRequest, @@ -64,8 +67,8 @@ export class BoardsServiceImpl @inject(BoardDiscovery) protected readonly boardDiscovery: BoardDiscovery; - async getState(): Promise { - return this.boardDiscovery.availablePorts; + async getDetectedPorts(): Promise { + return this.boardDiscovery.detectedPorts; } async getBoardDetails(options: { @@ -154,6 +157,7 @@ export class BoardsServiceImpl VID = prop.get('vid') || ''; PID = prop.get('pid') || ''; } + const buildProperties = detailsResp.getBuildPropertiesList(); return { fqbn, @@ -163,6 +167,7 @@ export class BoardsServiceImpl debuggingSupported, VID, PID, + buildProperties, }; } @@ -209,6 +214,28 @@ export class BoardsServiceImpl return this.handleListBoards(client.boardListAll.bind(client), req); } + async getInstalledPlatforms(): Promise { + const { instance, client } = await this.coreClient; + return new Promise((resolve, reject) => { + client.platformList( + new PlatformListRequest().setInstance(instance), + (err, response) => { + if (err) { + reject(err); + return; + } + resolve( + response + .getInstalledPlatformsList() + .map((platform, _, installedPlatforms) => + toBoardsPackage(platform, installedPlatforms) + ) + ); + } + ); + }); + } + private async handleListBoards( getBoards: ( request: BoardListAllRequest | BoardSearchRequest, @@ -229,10 +256,38 @@ export class BoardsServiceImpl for (const board of resp.getBoardsList()) { const platform = board.getPlatform(); if (platform) { + const platformId = platform.getId(); + 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: ${platform.getId()}. 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(), + packageId: parsedPlatformId, packageName: platform.getName(), manuallyInstalled: platform.getManuallyInstalled(), }); @@ -313,38 +368,6 @@ export class BoardsServiceImpl } ); const packages = new Map(); - 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) => { 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 = new Map(); @@ -397,7 +420,7 @@ export class BoardsServiceImpl pkg.availableVersions.push(platform.getLatest()); pkg.availableVersions.sort(Installable.Version.COMPARATOR).reverse(); } else { - packages.set(id, toPackage(platform)); + packages.set(id, toBoardsPackage(platform, installedPlatforms)); } } } @@ -474,7 +497,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`, @@ -569,3 +592,37 @@ function boardsPackageSortGroup(boardsPackage: BoardsPackage): SortGroup { } return types.join('-') as SortGroup; } + +function toBoardsPackage( + platform: Platform, + installedPlatforms: Platform[] +): BoardsPackage { + 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(', '), + types: platform.getTypeList(), + deprecated: platform.getDeprecated(), + summary: nls.localize( + 'arduino/component/boardsIncluded', + 'Boards included in this package:' + ), + installedVersion, + boards: platform + .getBoardsList() + .map((b) => { name: b.getName(), fqbn: b.getFqbn() }), + moreInfoLink: platform.getWebsite(), + }; +} diff --git a/arduino-ide-extension/src/node/clang-formatter.ts b/arduino-ide-extension/src/node/clang-formatter.ts index 20e10bc21..d29778b45 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 { 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 { - 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 { - 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 { + ): Promise { const clangFormatPaths = await Promise.all([ ...formatterConfigFolderUris.map((uri) => this.clangConfigPath(uri)), this.clangConfigPath(this.configDirPath()), @@ -72,11 +66,11 @@ 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 { @@ -88,7 +82,7 @@ export class ClangFormatter implements Formatter { } private async configDirPath(): Promise { - const configDirUri = await this.envVariableServer.getConfigDirUri(); + const configDirUri = await this.envVariablesServer.getConfigDirUri(); return FileUri.fsPath(configDirUri); } @@ -100,7 +94,7 @@ export class ClangFormatter implements Formatter { return undefined; } const folderPath = FileUri.fsPath(uri); - const clangFormatPath = join(folderPath, ClangFormatFile); + const clangFormatPath = join(folderPath, clangFormatFilename); try { await fs.access(clangFormatPath, constants.R_OK); return clangFormatPath; @@ -115,7 +109,7 @@ interface ClangFormatOptions { readonly TabWidth: number; } -const ClangFormatFile = '.clang-format'; +export const clangFormatFilename = '.clang-format'; function toClangOptions( options?: FormatterOptions | undefined @@ -129,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 { - // 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-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 8fed14afe..fbf5b47b7 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; setToolsDependenciesList(value: Array): BoardDetailsResponse; addToolsDependencies(value?: ToolsDependencies, index?: number): ToolsDependencies; - clearConfigOptionsList(): void; getConfigOptionsList(): Array; setConfigOptionsList(value: Array): BoardDetailsResponse; addConfigOptions(value?: ConfigOption, index?: number): ConfigOption; - clearProgrammersList(): void; getProgrammersList(): Array; setProgrammersList(value: Array): 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; setIdentificationPropertiesList(value: Array): BoardDetailsResponse; addIdentificationProperties(value?: BoardIdentificationProperties, index?: number): BoardIdentificationProperties; - + clearBuildPropertiesList(): void; + getBuildPropertiesList(): Array; + setBuildPropertiesList(value: Array): BoardDetailsResponse; + addBuildProperties(value: string, index?: number): string; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardDetailsResponse.AsObject; @@ -120,6 +111,7 @@ export namespace BoardDetailsResponse { programmersList: Array, debuggingSupported: boolean, identificationPropertiesList: Array, + buildPropertiesList: Array, } } @@ -128,7 +120,6 @@ export class BoardIdentificationProperties extends jspb.Message { getPropertiesMap(): jspb.Map; 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; setSystemsList(value: Array): 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; setValuesList(value: Array): 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; @@ -394,14 +356,11 @@ export class BoardListRequest 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): BoardListRequest; - getTimeout(): number; setTimeout(value: number): BoardListRequest; - getFqbn(): string; setFqbn(value: string): BoardListRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListRequest.AsObject; static toObject(includeInstance: boolean, msg: BoardListRequest): BoardListRequest.AsObject; @@ -426,7 +385,6 @@ export class BoardListResponse extends jspb.Message { setPortsList(value: Array): BoardListResponse; addPorts(value?: DetectedPort, index?: number): DetectedPort; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListResponse.AsObject; static toObject(includeInstance: boolean, msg: BoardListResponse): BoardListResponse.AsObject; @@ -449,13 +407,11 @@ export class DetectedPort extends jspb.Message { setMatchingBoardsList(value: Array): 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; @@ -479,16 +435,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; setSearchArgsList(value: Array): 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; @@ -513,7 +466,6 @@ export class BoardListAllResponse extends jspb.Message { setBoardsList(value: Array): BoardListAllResponse; addBoards(value?: BoardListItem, index?: number): BoardListItem; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListAllResponse.AsObject; static toObject(includeInstance: boolean, msg: BoardListAllResponse): BoardListAllResponse.AsObject; @@ -536,11 +488,9 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardListWatchRequest.AsObject; static toObject(includeInstance: boolean, msg: BoardListWatchRequest): BoardListWatchRequest.AsObject; @@ -562,16 +512,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; @@ -593,20 +540,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; @@ -632,14 +575,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; @@ -664,7 +604,6 @@ export class BoardSearchResponse extends jspb.Message { setBoardsList(value: Array): BoardSearchResponse; addBoards(value?: BoardListItem, index?: number): BoardListItem; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BoardSearchResponse.AsObject; static toObject(includeInstance: boolean, msg: BoardSearchResponse): BoardSearchResponse.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 83a3002b6..da5148eac 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,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); @@ -492,7 +498,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) { @@ -538,6 +545,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; @@ -582,6 +593,13 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsRequest.serializeBinaryToWriter = f f ); } + f = message.getDoNotExpandBuildProperties(); + if (f) { + writer.writeBool( + 3, + f + ); + } }; @@ -640,13 +658,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} * @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]; @@ -696,7 +732,8 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.toObject = function(includ 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 }; if (includeInstance) { @@ -795,6 +832,10 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.deserializeBinaryFromReade 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; default: reader.skipField(); break; @@ -928,6 +969,13 @@ 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 + ); + } }; @@ -1301,6 +1349,43 @@ proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.clearIdentificat }; +/** + * repeated string build_properties = 16; + * @return {!Array} + */ +proto.cc.arduino.cli.commands.v1.BoardDetailsResponse.prototype.getBuildPropertiesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 16)); +}; + + +/** + * @param {!Array} 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([]); +}; + + 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 b321b3c23..c5159b1cb 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,7 +5,6 @@ /* 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"; @@ -26,6 +25,7 @@ interface IArduinoCoreServiceService extends grpc.ServiceDefinition; responseDeserialize: grpc.deserialize; } +interface IArduinoCoreServiceService_ISetSketchDefaults extends grpc.MethodDefinition { + path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/SetSketchDefaults"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} interface IArduinoCoreServiceService_IBoardDetails extends grpc.MethodDefinition { path: "/cc.arduino.cli.commands.v1.ArduinoCoreService/BoardDetails"; requestStream: false; @@ -402,7 +411,7 @@ interface IArduinoCoreServiceService_IEnumerateMonitorPortSettings extends grpc. export const ArduinoCoreServiceService: IArduinoCoreServiceService; -export interface IArduinoCoreServiceServer { +export interface IArduinoCoreServiceServer extends grpc.UntypedServiceImplementation { create: grpc.handleUnaryCall; init: grpc.handleServerStreamingCall; destroy: grpc.handleUnaryCall; @@ -412,6 +421,7 @@ export interface IArduinoCoreServiceServer { newSketch: grpc.handleUnaryCall; loadSketch: grpc.handleUnaryCall; archiveSketch: grpc.handleUnaryCall; + setSketchDefaults: grpc.handleUnaryCall; boardDetails: grpc.handleUnaryCall; boardList: grpc.handleUnaryCall; boardListAll: grpc.handleUnaryCall; @@ -468,6 +478,9 @@ 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, 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, 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, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => void): grpc.ClientUnaryCall; @@ -568,6 +581,9 @@ 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, 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, 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, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_commands_v1_board_pb.BoardDetailsResponse) => 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 49ec3d019..8947c7570 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 @@ -709,6 +709,28 @@ 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_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_SetSketchDefaultsRequest(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +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_SetSketchDefaultsResponse(buffer_arg) { + return cc_arduino_cli_commands_v1_commands_pb.SetSketchDefaultsResponse.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'); @@ -975,6 +997,20 @@ archiveSketch: { responseSerialize: serialize_cc_arduino_cli_commands_v1_ArchiveSketchResponse, responseDeserialize: deserialize_cc_arduino_cli_commands_v1_ArchiveSketchResponse, }, + // 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, + }, // BOARD 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 fc1c8b525..73ed929aa 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 @@ -38,7 +38,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 +60,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,19 +90,16 @@ 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; - getMessageCase(): InitResponse.MessageCase; serializeBinary(): Uint8Array; @@ -134,13 +127,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,13 +152,9 @@ export namespace InitResponse { export enum MessageCase { MESSAGE_NOT_SET = 0, - - INIT_PROGRESS = 1, - - ERROR = 2, - - PROFILE = 3, - + INIT_PROGRESS = 1, + ERROR = 2, + PROFILE = 3, } } @@ -175,11 +162,9 @@ export namespace InitResponse { 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; @@ -204,7 +189,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; @@ -244,11 +228,9 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateIndexRequest.AsObject; static toObject(includeInstance: boolean, msg: UpdateIndexRequest): UpdateIndexRequest.AsObject; @@ -273,7 +255,6 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateIndexResponse.AsObject; static toObject(includeInstance: boolean, msg: UpdateIndexResponse): UpdateIndexResponse.AsObject; @@ -297,7 +278,6 @@ export class UpdateLibrariesIndexRequest extends jspb.Message { getInstance(): cc_arduino_cli_commands_v1_common_pb.Instance | undefined; setInstance(value?: cc_arduino_cli_commands_v1_common_pb.Instance): UpdateLibrariesIndexRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateLibrariesIndexRequest.AsObject; static toObject(includeInstance: boolean, msg: UpdateLibrariesIndexRequest): UpdateLibrariesIndexRequest.AsObject; @@ -321,7 +301,6 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UpdateLibrariesIndexResponse.AsObject; static toObject(includeInstance: boolean, msg: UpdateLibrariesIndexResponse): UpdateLibrariesIndexResponse.AsObject; @@ -359,7 +338,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; @@ -377,22 +355,13 @@ 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; static toObject(includeInstance: boolean, msg: NewSketchRequest): NewSketchRequest.AsObject; @@ -405,7 +374,6 @@ 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, @@ -416,7 +384,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; @@ -434,16 +401,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; @@ -456,7 +416,6 @@ export class LoadSketchRequest extends jspb.Message { export namespace LoadSketchRequest { export type AsObject = { - instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, sketchPath: string, } } @@ -464,25 +423,26 @@ export namespace LoadSketchRequest { export class LoadSketchResponse extends jspb.Message { getMainFile(): string; setMainFile(value: string): LoadSketchResponse; - getLocationPath(): string; setLocationPath(value: string): LoadSketchResponse; - clearOtherSketchFilesList(): void; getOtherSketchFilesList(): Array; setOtherSketchFilesList(value: Array): LoadSketchResponse; addOtherSketchFiles(value: string, index?: number): string; - clearAdditionalFilesList(): void; getAdditionalFilesList(): Array; setAdditionalFilesList(value: Array): LoadSketchResponse; addAdditionalFiles(value: string, index?: number): string; - clearRootFolderFilesList(): void; getRootFolderFilesList(): Array; setRootFolderFilesList(value: Array): LoadSketchResponse; addRootFolderFiles(value: string, index?: number): string; - + getDefaultFqbn(): string; + setDefaultFqbn(value: string): LoadSketchResponse; + getDefaultPort(): string; + setDefaultPort(value: string): LoadSketchResponse; + getDefaultProtocol(): string; + setDefaultProtocol(value: string): LoadSketchResponse; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LoadSketchResponse.AsObject; @@ -501,23 +461,22 @@ export namespace LoadSketchResponse { otherSketchFilesList: Array, additionalFilesList: Array, rootFolderFilesList: Array, + defaultFqbn: string, + defaultPort: string, + defaultProtocol: string, } } 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; static toObject(includeInstance: boolean, msg: ArchiveSketchRequest): ArchiveSketchRequest.AsObject; @@ -554,9 +513,65 @@ export namespace ArchiveSketchResponse { } } +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; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SetSketchDefaultsRequest.AsObject; + static toObject(includeInstance: boolean, msg: SetSketchDefaultsRequest): SetSketchDefaultsRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + 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, + } +} + +export class SetSketchDefaultsResponse extends jspb.Message { + getDefaultFqbn(): string; + setDefaultFqbn(value: string): SetSketchDefaultsResponse; + getDefaultPortAddress(): string; + setDefaultPortAddress(value: string): SetSketchDefaultsResponse; + getDefaultPortProtocol(): string; + setDefaultPortProtocol(value: string): SetSketchDefaultsResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SetSketchDefaultsResponse.AsObject; + static toObject(includeInstance: boolean, msg: SetSketchDefaultsResponse): SetSketchDefaultsResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + 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, + } +} + 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 62c15ec81..00132ca3b 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,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_rpc_status_pb = require('../../../../../google/rpc/status_pb.js'); goog.object.extend(proto, google_rpc_status_pb); @@ -47,6 +53,8 @@ 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.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.UpdateLibrariesIndexRequest', null, global); @@ -473,6 +481,48 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.displayName = 'proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse'; } +/** + * 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.SetSketchDefaultsRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.displayName = 'proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest'; +} +/** + * 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.SetSketchDefaultsResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.displayName = 'proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse'; +} @@ -2727,7 +2777,6 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.toObject = function( */ proto.cc.arduino.cli.commands.v1.NewSketchRequest.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, ""), overwrite: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) @@ -2767,11 +2816,6 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.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); - break; case 2: var value = /** @type {string} */ (reader.readString()); msg.setSketchName(value); @@ -2813,14 +2857,6 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.serializeBinary = fu */ proto.cc.arduino.cli.commands.v1.NewSketchRequest.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(); if (f.length > 0) { writer.writeString( @@ -2845,43 +2881,6 @@ proto.cc.arduino.cli.commands.v1.NewSketchRequest.serializeBinaryToWriter = func }; -/** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} - */ -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)); -}; - - -/** - * @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); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.NewSketchRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.NewSketchRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - /** * optional string sketch_name = 2; * @return {string} @@ -3098,7 +3097,6 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.toObject = function */ 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), sketchPath: jspb.Message.getFieldWithDefault(msg, 2, "") }; @@ -3136,11 +3134,6 @@ 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); - break; case 2: var value = /** @type {string} */ (reader.readString()); msg.setSketchPath(value); @@ -3174,14 +3167,6 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.serializeBinary = f */ 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.getSketchPath(); if (f.length > 0) { writer.writeString( @@ -3192,43 +3177,6 @@ proto.cc.arduino.cli.commands.v1.LoadSketchRequest.serializeBinaryToWriter = fun }; -/** - * optional Instance instance = 1; - * @return {?proto.cc.arduino.cli.commands.v1.Instance} - */ -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)); -}; - - -/** - * @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); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchRequest} returns this - */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.clearInstance = function() { - return this.setInstance(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.cc.arduino.cli.commands.v1.LoadSketchRequest.prototype.hasInstance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - /** * optional string sketch_path = 2; * @return {string} @@ -3290,7 +3238,10 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.toObject = function(includeI 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 + 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, "") }; if (includeInstance) { @@ -3347,6 +3298,18 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.deserializeBinaryFromReader var value = /** @type {string} */ (reader.readString()); msg.addRootFolderFiles(value); break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultFqbn(value); + break; + case 7: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultPort(value); + break; + case 8: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultProtocol(value); + break; default: reader.skipField(); break; @@ -3411,6 +3374,27 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.serializeBinaryToWriter = fu f ); } + f = message.getDefaultFqbn(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } + f = message.getDefaultPort(); + if (f.length > 0) { + writer.writeString( + 7, + f + ); + } + f = message.getDefaultProtocol(); + if (f.length > 0) { + writer.writeString( + 8, + f + ); + } }; @@ -3561,6 +3545,60 @@ proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.clearRootFolderFil }; +/** + * optional string default_fqbn = 6; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getDefaultFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setDefaultFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 6, value); +}; + + +/** + * optional string default_port = 7; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getDefaultPort = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setDefaultPort = function(value) { + return jspb.Message.setProto3StringField(this, 7, value); +}; + + +/** + * optional string default_protocol = 8; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.getDefaultProtocol = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.LoadSketchResponse} returns this + */ +proto.cc.arduino.cli.commands.v1.LoadSketchResponse.prototype.setDefaultProtocol = function(value) { + return jspb.Message.setProto3StringField(this, 8, value); +}; + + @@ -3882,6 +3920,416 @@ proto.cc.arduino.cli.commands.v1.ArchiveSketchResponse.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_, 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.SetSketchDefaultsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.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.SetSketchDefaultsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + sketchPath: jspb.Message.getFieldWithDefault(msg, 1, ""), + defaultFqbn: jspb.Message.getFieldWithDefault(msg, 2, ""), + defaultPortAddress: jspb.Message.getFieldWithDefault(msg, 3, ""), + defaultPortProtocol: 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.SetSketchDefaultsRequest} + */ +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.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.SetSketchDefaultsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.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.setSketchPath(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + 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; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.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.SetSketchDefaultsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSketchPath(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + 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 + ); + } +}; + + +/** + * optional string sketch_path = 1; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getSketchPath = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @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); +}; + + +/** + * optional string default_fqbn = 2; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.getDefaultFqbn = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsRequest.prototype.setDefaultFqbn = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string default_port_address = 3; + * @return {string} + */ +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.SetSketchDefaultsRequest} returns this + */ +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); +}; + + + + + +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_, 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.SetSketchDefaultsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.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.SetSketchDefaultsResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.toObject = function(includeInstance, msg) { + var f, obj = { + defaultFqbn: jspb.Message.getFieldWithDefault(msg, 1, ""), + defaultPortAddress: jspb.Message.getFieldWithDefault(msg, 2, ""), + defaultPortProtocol: 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.SetSketchDefaultsResponse} + */ +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.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.SetSketchDefaultsResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse} + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.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.setDefaultFqbn(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultPortAddress(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setDefaultPortProtocol(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.SetSketchDefaultsResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.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.SetSketchDefaultsResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.commands.v1.SetSketchDefaultsResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDefaultFqbn(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getDefaultPortAddress(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getDefaultPortProtocol(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } +}; + + +/** + * optional string default_fqbn = 1; + * @return {string} + */ +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.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); +}; + + /** * @enum {number} */ @@ -3889,7 +4337,8 @@ 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_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 7d7926f9e..7df25a374 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; @@ -34,19 +33,16 @@ export class DownloadProgress extends jspb.Message { getStart(): DownloadProgressStart | undefined; setStart(value?: DownloadProgressStart): DownloadProgress; - hasUpdate(): boolean; clearUpdate(): void; getUpdate(): DownloadProgressUpdate | undefined; setUpdate(value?: DownloadProgressUpdate): DownloadProgress; - hasEnd(): boolean; clearEnd(): void; getEnd(): DownloadProgressEnd | undefined; setEnd(value?: DownloadProgressEnd): DownloadProgress; - getMessageCase(): DownloadProgress.MessageCase; serializeBinary(): Uint8Array; @@ -68,13 +64,9 @@ export namespace DownloadProgress { export enum MessageCase { MESSAGE_NOT_SET = 0, - - START = 1, - - UPDATE = 2, - - END = 3, - + START = 1, + UPDATE = 2, + END = 3, } } @@ -82,11 +74,9 @@ export namespace DownloadProgress { 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; @@ -107,11 +97,9 @@ export namespace DownloadProgressStart { 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; @@ -132,11 +120,9 @@ export namespace DownloadProgressUpdate { 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; @@ -157,17 +143,13 @@ export namespace DownloadProgressEnd { 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; @@ -190,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; @@ -219,47 +198,39 @@ export namespace Programmer { export class Platform extends jspb.Message { getId(): string; setId(value: string): Platform; - getInstalled(): string; setInstalled(value: string): Platform; - getLatest(): string; setLatest(value: string): Platform; - getName(): string; setName(value: string): Platform; - getMaintainer(): string; setMaintainer(value: string): Platform; - getWebsite(): string; setWebsite(value: string): Platform; - getEmail(): string; setEmail(value: string): Platform; - clearBoardsList(): void; getBoardsList(): Array; setBoardsList(value: Array): Platform; addBoards(value?: Board, index?: number): Board; - getManuallyInstalled(): boolean; setManuallyInstalled(value: boolean): Platform; - getDeprecated(): boolean; setDeprecated(value: boolean): Platform; - clearTypeList(): void; getTypeList(): Array; setTypeList(value: Array): Platform; addType(value: string, index?: number): string; - hasHelp(): boolean; clearHelp(): void; getHelp(): HelpResources | undefined; setHelp(value?: HelpResources): Platform; - + getIndexed(): boolean; + setIndexed(value: boolean): Platform; + getMissingMetadata(): boolean; + setMissingMetadata(value: boolean): Platform; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Platform.AsObject; @@ -285,23 +256,21 @@ export namespace Platform { deprecated: boolean, typeList: Array, help?: HelpResources.AsObject, + indexed: boolean, + missingMetadata: 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; @@ -324,11 +293,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; @@ -349,11 +316,9 @@ export namespace Board { export class Profile extends jspb.Message { getName(): string; setName(value: string): Profile; - getFqbn(): string; setFqbn(value: string): Profile; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Profile.AsObject; static toObject(includeInstance: boolean, msg: Profile): Profile.AsObject; @@ -375,7 +340,6 @@ export class HelpResources extends jspb.Message { getOnline(): string; setOnline(value: string): HelpResources; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): HelpResources.AsObject; static toObject(includeInstance: boolean, msg: HelpResources): HelpResources.AsObject; 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 3a8294695..f0eaaaf44 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,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.Board', null, global); goog.exportSymbol('proto.cc.arduino.cli.commands.v1.DownloadProgress', null, global); @@ -1631,7 +1637,9 @@ proto.cc.arduino.cli.commands.v1.Platform.toObject = function(includeInstance, m manuallyInstalled: jspb.Message.getBooleanFieldWithDefault(msg, 9, false), deprecated: jspb.Message.getBooleanFieldWithDefault(msg, 10, false), typeList: (f = jspb.Message.getRepeatedField(msg, 11)) == null ? undefined : f, - help: (f = msg.getHelp()) && proto.cc.arduino.cli.commands.v1.HelpResources.toObject(includeInstance, f) + help: (f = msg.getHelp()) && proto.cc.arduino.cli.commands.v1.HelpResources.toObject(includeInstance, f), + indexed: jspb.Message.getBooleanFieldWithDefault(msg, 13, false), + missingMetadata: jspb.Message.getBooleanFieldWithDefault(msg, 14, false) }; if (includeInstance) { @@ -1718,6 +1726,14 @@ proto.cc.arduino.cli.commands.v1.Platform.deserializeBinaryFromReader = function reader.readMessage(value,proto.cc.arduino.cli.commands.v1.HelpResources.deserializeBinaryFromReader); msg.setHelp(value); break; + case 13: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setIndexed(value); + break; + case 14: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setMissingMetadata(value); + break; default: reader.skipField(); break; @@ -1833,6 +1849,20 @@ proto.cc.arduino.cli.commands.v1.Platform.serializeBinaryToWriter = function(mes proto.cc.arduino.cli.commands.v1.HelpResources.serializeBinaryToWriter ); } + f = message.getIndexed(); + if (f) { + writer.writeBool( + 13, + f + ); + } + f = message.getMissingMetadata(); + if (f) { + writer.writeBool( + 14, + f + ); + } }; @@ -2110,6 +2140,42 @@ proto.cc.arduino.cli.commands.v1.Platform.prototype.hasHelp = function() { }; +/** + * optional bool indexed = 13; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.getIndexed = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 13, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.setIndexed = function(value) { + return jspb.Message.setProto3BooleanField(this, 13, value); +}; + + +/** + * optional bool missing_metadata = 14; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.getMissingMetadata = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 14, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.setMissingMetadata = function(value) { + return jspb.Message.setProto3BooleanField(this, 14, value); +}; + + 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 692e2a3d5..d24160005 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 @@ -15,86 +15,64 @@ 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; setBuildPropertiesList(value: Array): 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; - getJobs(): number; setJobs(value: number): CompileRequest; - clearLibrariesList(): void; getLibrariesList(): Array; setLibrariesList(value: Array): 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; clearSourceOverrideMap(): void; - hasExportBinaries(): boolean; clearExportBinaries(): void; getExportBinaries(): google_protobuf_wrappers_pb.BoolValue | undefined; setExportBinaries(value?: google_protobuf_wrappers_pb.BoolValue): CompileRequest; - clearLibraryList(): void; getLibraryList(): Array; setLibraryList(value: Array): 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; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): CompileRequest.AsObject; @@ -133,6 +111,7 @@ export namespace CompileRequest { signKey: string, encryptKey: string, skipLibrariesDiscovery: boolean, + doNotExpandBuildProperties: boolean, } } @@ -141,49 +120,40 @@ export class CompileResponse extends jspb.Message { getOutStream_asU8(): Uint8Array; getOutStream_asB64(): string; setOutStream(value: Uint8Array | string): CompileResponse; - getErrStream(): Uint8Array | string; getErrStream_asU8(): Uint8Array; getErrStream_asB64(): string; setErrStream(value: Uint8Array | string): CompileResponse; - getBuildPath(): string; setBuildPath(value: string): CompileResponse; - clearUsedLibrariesList(): void; getUsedLibrariesList(): Array; setUsedLibrariesList(value: Array): CompileResponse; addUsedLibraries(value?: cc_arduino_cli_commands_v1_lib_pb.Library, index?: number): cc_arduino_cli_commands_v1_lib_pb.Library; - clearExecutableSectionsSizeList(): void; getExecutableSectionsSizeList(): Array; setExecutableSectionsSizeList(value: Array): CompileResponse; 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; - 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; - clearBuildPropertiesList(): void; getBuildPropertiesList(): Array; setBuildPropertiesList(value: Array): CompileResponse; addBuildProperties(value: string, index?: number): string; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): CompileResponse.AsObject; static toObject(includeInstance: boolean, msg: CompileResponse): CompileResponse.AsObject; @@ -211,14 +181,11 @@ export namespace CompileResponse { 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; 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 f32a64b87..7dcaad1ee 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,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_wrappers_pb = require('google-protobuf/google/protobuf/wrappers_pb.js'); goog.object.extend(proto, google_protobuf_wrappers_pb); @@ -149,7 +155,8 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.toObject = function(includeInsta 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) }; if (includeInstance) { @@ -286,6 +293,10 @@ 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; default: reader.skipField(); break; @@ -482,6 +493,13 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.serializeBinaryToWriter = functi f ); } + f = message.getDoNotExpandBuildProperties(); + if (f) { + writer.writeBool( + 29, + f + ); + } }; @@ -1016,6 +1034,24 @@ 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)); +}; + + +/** + * @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); +}; + + /** * List of repeated fields within this message type. 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 dc8d8b97c..3034f8446 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,23 +13,17 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformInstallRequest.AsObject; static toObject(includeInstance: boolean, msg: PlatformInstallRequest): PlatformInstallRequest.AsObject; @@ -58,13 +52,11 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformInstallResponse.AsObject; static toObject(includeInstance: boolean, msg: PlatformInstallResponse): PlatformInstallResponse.AsObject; @@ -105,17 +97,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; @@ -142,7 +130,6 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformDownloadResponse.AsObject; static toObject(includeInstance: boolean, msg: PlatformDownloadResponse): PlatformDownloadResponse.AsObject; @@ -165,14 +152,11 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUninstallRequest.AsObject; static toObject(includeInstance: boolean, msg: PlatformUninstallRequest): PlatformUninstallRequest.AsObject; @@ -198,7 +182,6 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUninstallResponse.AsObject; static toObject(includeInstance: boolean, msg: PlatformUninstallResponse): PlatformUninstallResponse.AsObject; @@ -238,17 +221,13 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUpgradeRequest.AsObject; static toObject(includeInstance: boolean, msg: PlatformUpgradeRequest): PlatformUpgradeRequest.AsObject; @@ -275,12 +254,15 @@ 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; + hasPlatform(): boolean; + clearPlatform(): void; + getPlatform(): cc_arduino_cli_commands_v1_common_pb.Platform | undefined; + setPlatform(value?: cc_arduino_cli_commands_v1_common_pb.Platform): PlatformUpgradeResponse; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformUpgradeResponse.AsObject; @@ -296,6 +278,7 @@ 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, + platform?: cc_arduino_cli_commands_v1_common_pb.Platform.AsObject, } } @@ -305,14 +288,11 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformSearchRequest.AsObject; static toObject(includeInstance: boolean, msg: PlatformSearchRequest): PlatformSearchRequest.AsObject; @@ -337,7 +317,6 @@ export class PlatformSearchResponse extends jspb.Message { setSearchOutputList(value: Array): PlatformSearchResponse; addSearchOutput(value?: cc_arduino_cli_commands_v1_common_pb.Platform, index?: number): cc_arduino_cli_commands_v1_common_pb.Platform; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PlatformSearchResponse.AsObject; static toObject(includeInstance: boolean, msg: PlatformSearchResponse): PlatformSearchResponse.AsObject; @@ -360,14 +339,11 @@ export class PlatformListRequest 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): 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; @@ -392,7 +368,6 @@ export class PlatformListResponse extends jspb.Message { setInstalledPlatformsList(value: Array): 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; 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 f1f3b7793..837c234fe 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,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); @@ -2058,7 +2064,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), + platform: (f = msg.getPlatform()) && cc_arduino_cli_commands_v1_common_pb.Platform.toObject(includeInstance, f) }; if (includeInstance) { @@ -2105,6 +2112,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 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; @@ -2150,6 +2162,14 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.serializeBinaryToWriter cc_arduino_cli_commands_v1_common_pb.TaskProgress.serializeBinaryToWriter ); } + f = message.getPlatform(); + if (f != null) { + writer.writeMessage( + 3, + f, + cc_arduino_cli_commands_v1_common_pb.Platform.serializeBinaryToWriter + ); + } }; @@ -2227,6 +2247,43 @@ proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.hasTaskProgre }; +/** + * optional Platform platform = 3; + * @return {?proto.cc.arduino.cli.commands.v1.Platform} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.getPlatform = function() { + return /** @type{?proto.cc.arduino.cli.commands.v1.Platform} */ ( + jspb.Message.getWrapperField(this, cc_arduino_cli_commands_v1_common_pb.Platform, 3)); +}; + + +/** + * @param {?proto.cc.arduino.cli.commands.v1.Platform|undefined} value + * @return {!proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse} returns this +*/ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.setPlatform = function(value) { + return jspb.Message.setWrapperField(this, 3, 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.clearPlatform = function() { + return this.setPlatform(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.PlatformUpgradeResponse.prototype.hasPlatform = function() { + return jspb.Message.getField(this, 3) != null; +}; + + 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 27866d15a..e0b50ba58 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,7 +43,6 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryDownloadResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryDownloadResponse): LibraryDownloadResponse.AsObject; @@ -69,23 +65,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,13 +104,11 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryInstallResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryInstallResponse): LibraryInstallResponse.AsObject; @@ -144,14 +132,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,13 +162,11 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUpgradeResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryUpgradeResponse): LibraryUpgradeResponse.AsObject; @@ -207,14 +190,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,7 +220,6 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUninstallResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryUninstallResponse): LibraryUninstallResponse.AsObject; @@ -264,7 +243,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,13 +266,11 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryUpgradeAllResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryUpgradeAllResponse): LibraryUpgradeAllResponse.AsObject; @@ -318,14 +294,11 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryResolveDependenciesRequest.AsObject; static toObject(includeInstance: boolean, msg: LibraryResolveDependenciesRequest): LibraryResolveDependenciesRequest.AsObject; @@ -350,7 +323,6 @@ export class LibraryResolveDependenciesResponse extends jspb.Message { setDependenciesList(value: Array): LibraryResolveDependenciesResponse; addDependencies(value?: LibraryDependencyStatus, index?: number): LibraryDependencyStatus; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryResolveDependenciesResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryResolveDependenciesResponse): LibraryResolveDependenciesResponse.AsObject; @@ -370,14 +342,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,13 +371,12 @@ 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; @@ -425,6 +393,7 @@ export namespace LibrarySearchRequest { instance?: cc_arduino_cli_commands_v1_common_pb.Instance.AsObject, query: string, omitReleasesDetails: boolean, + searchArgs: string, } } @@ -433,11 +402,9 @@ export class LibrarySearchResponse extends jspb.Message { getLibrariesList(): Array; setLibrariesList(value: Array): 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; @@ -459,22 +426,18 @@ export class SearchedLibrary extends jspb.Message { getName(): string; setName(value: string): SearchedLibrary; - getReleasesMap(): jspb.Map; clearReleasesMap(): void; - hasLatest(): boolean; clearLatest(): void; getLatest(): LibraryRelease | undefined; setLatest(value?: LibraryRelease): SearchedLibrary; - clearAvailableVersionsList(): void; getAvailableVersionsList(): Array; setAvailableVersionsList(value: Array): SearchedLibrary; addAvailableVersions(value: string, index?: number): string; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SearchedLibrary.AsObject; static toObject(includeInstance: boolean, msg: SearchedLibrary): SearchedLibrary.AsObject; @@ -498,55 +461,42 @@ export namespace SearchedLibrary { 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; setArchitecturesList(value: Array): LibraryRelease; addArchitectures(value: string, index?: number): string; - clearTypesList(): void; getTypesList(): Array; setTypesList(value: Array): 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; setProvidesIncludesList(value: Array): LibraryRelease; addProvidesIncludes(value: string, index?: number): string; - clearDependenciesList(): void; getDependenciesList(): Array; setDependenciesList(value: Array): LibraryRelease; addDependencies(value?: LibraryDependency, index?: number): LibraryDependency; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryRelease.AsObject; static toObject(includeInstance: boolean, msg: LibraryRelease): LibraryRelease.AsObject; @@ -578,11 +528,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; @@ -603,20 +551,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; @@ -643,20 +586,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; @@ -683,7 +621,6 @@ export class LibraryListResponse extends jspb.Message { setInstalledLibrariesList(value: Array): LibraryListResponse; addInstalledLibraries(value?: InstalledLibrary, index?: number): InstalledLibrary; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LibraryListResponse.AsObject; static toObject(includeInstance: boolean, msg: LibraryListResponse): LibraryListResponse.AsObject; @@ -707,13 +644,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; @@ -734,93 +669,67 @@ 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; setArchitecturesList(value: Array): Library; addArchitectures(value: string, index?: number): string; - clearTypesList(): void; getTypesList(): Array; setTypesList(value: Array): 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; - 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; clearPropertiesMap(): void; - getLocation(): LibraryLocation; setLocation(value: LibraryLocation): Library; - getLayout(): LibraryLayout; setLayout(value: LibraryLayout): Library; - clearExamplesList(): void; getExamplesList(): Array; setExamplesList(value: Array): Library; addExamples(value: string, index?: number): string; - clearProvidesIncludesList(): void; getProvidesIncludesList(): Array; setProvidesIncludesList(value: Array): Library; addProvidesIncludes(value: string, index?: number): string; - getCompatibleWithMap(): jspb.Map; clearCompatibleWithMap(): void; - getInDevelopment(): boolean; setInDevelopment(value: boolean): Library; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Library.AsObject; static toObject(includeInstance: boolean, msg: Library): Library.AsObject; @@ -870,14 +779,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; @@ -903,7 +809,6 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ZipLibraryInstallResponse.AsObject; static toObject(includeInstance: boolean, msg: ZipLibraryInstallResponse): ZipLibraryInstallResponse.AsObject; @@ -926,14 +831,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; @@ -959,7 +861,6 @@ 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; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): GitLibraryInstallResponse.AsObject; static toObject(includeInstance: boolean, msg: GitLibraryInstallResponse): GitLibraryInstallResponse.AsObject; 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 4923acaa8..7ec2e0bbf 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,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); @@ -3203,7 +3209,8 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.toObject = function(includ 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, 3, false) + omitReleasesDetails: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + searchArgs: jspb.Message.getFieldWithDefault(msg, 4, "") }; if (includeInstance) { @@ -3253,6 +3260,10 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.deserializeBinaryFromReade var value = /** @type {boolean} */ (reader.readBool()); msg.setOmitReleasesDetails(value); break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setSearchArgs(value); + break; default: reader.skipField(); break; @@ -3304,6 +3315,13 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.serializeBinaryToWriter = f ); } + f = message.getSearchArgs(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } }; @@ -3380,6 +3398,24 @@ proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.setOmitReleasesD }; +/** + * optional string search_args = 4; + * @return {string} + */ +proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.getSearchArgs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.commands.v1.LibrarySearchRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.LibrarySearchRequest.prototype.setSearchArgs = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + /** * List of repeated fields within this message type. 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..49140fcb5 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 @@ -15,27 +15,22 @@ export class MonitorRequest extends jspb.Message { 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; - getTxData(): Uint8Array | string; getTxData_asU8(): Uint8Array; getTxData_asB64(): string; setTxData(value: Uint8Array | string): MonitorRequest; - hasPortConfiguration(): boolean; clearPortConfiguration(): void; getPortConfiguration(): MonitorPortConfiguration | undefined; setPortConfiguration(value?: MonitorPortConfiguration): MonitorRequest; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): MonitorRequest.AsObject; static toObject(includeInstance: boolean, msg: MonitorRequest): MonitorRequest.AsObject; @@ -62,7 +57,6 @@ export class MonitorPortConfiguration extends jspb.Message { setSettingsList(value: Array): MonitorPortConfiguration; addSettings(value?: MonitorPortSetting, index?: number): MonitorPortSetting; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): MonitorPortConfiguration.AsObject; static toObject(includeInstance: boolean, msg: MonitorPortConfiguration): MonitorPortConfiguration.AsObject; @@ -82,21 +76,17 @@ export namespace MonitorPortConfiguration { export class MonitorResponse extends jspb.Message { getError(): string; setError(value: string): MonitorResponse; - getRxData(): Uint8Array | string; getRxData_asU8(): Uint8Array; getRxData_asB64(): string; setRxData(value: Uint8Array | string): MonitorResponse; - clearAppliedSettingsList(): void; getAppliedSettingsList(): Array; setAppliedSettingsList(value: Array): MonitorResponse; addAppliedSettings(value?: MonitorPortSetting, index?: number): MonitorPortSetting; - getSuccess(): boolean; setSuccess(value: boolean): MonitorResponse; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): MonitorResponse.AsObject; static toObject(includeInstance: boolean, msg: MonitorResponse): MonitorResponse.AsObject; @@ -119,11 +109,9 @@ export namespace MonitorResponse { 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; @@ -147,14 +135,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 +164,6 @@ export class EnumerateMonitorPortSettingsResponse extends jspb.Message { setSettingsList(value: Array): EnumerateMonitorPortSettingsResponse; addSettings(value?: MonitorPortSettingDescriptor, index?: number): MonitorPortSettingDescriptor; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): EnumerateMonitorPortSettingsResponse.AsObject; static toObject(includeInstance: boolean, msg: EnumerateMonitorPortSettingsResponse): EnumerateMonitorPortSettingsResponse.AsObject; @@ -199,22 +183,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; setEnumValuesList(value: Array): 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..db4445ce3 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); 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 17c863eea..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,24 +9,18 @@ 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; clearPropertiesMap(): void; - getHardwareId(): string; setHardwareId(value: string): Port; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Port.AsObject; static toObject(includeInstance: boolean, msg: Port): Port.AsObject; 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 6f905454d..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); /** 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..6c82e5557 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,42 +14,31 @@ 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; clearUserFieldsMap(): void; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UploadRequest.AsObject; static toObject(includeInstance: boolean, msg: UploadRequest): UploadRequest.AsObject; @@ -78,16 +67,27 @@ export namespace UploadRequest { } 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 +103,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}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + 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,42 +161,31 @@ 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; clearUserFieldsMap(): void; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UploadUsingProgrammerRequest.AsObject; static toObject(includeInstance: boolean, msg: UploadUsingProgrammerRequest): UploadUsingProgrammerRequest.AsObject; @@ -197,13 +218,11 @@ export class UploadUsingProgrammerResponse extends jspb.Message { getOutStream_asU8(): Uint8Array; getOutStream_asB64(): string; setOutStream(value: Uint8Array | string): UploadUsingProgrammerResponse; - getErrStream(): Uint8Array | string; getErrStream_asU8(): Uint8Array; getErrStream_asB64(): string; setErrStream(value: Uint8Array | string): UploadUsingProgrammerResponse; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): UploadUsingProgrammerResponse.AsObject; static toObject(includeInstance: boolean, msg: UploadUsingProgrammerResponse): UploadUsingProgrammerResponse.AsObject; @@ -227,33 +246,25 @@ 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; clearUserFieldsMap(): void; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BurnBootloaderRequest.AsObject; static toObject(includeInstance: boolean, msg: BurnBootloaderRequest): BurnBootloaderRequest.AsObject; @@ -283,13 +294,11 @@ export class BurnBootloaderResponse extends jspb.Message { getOutStream_asU8(): Uint8Array; getOutStream_asB64(): string; setOutStream(value: Uint8Array | string): BurnBootloaderResponse; - getErrStream(): Uint8Array | string; getErrStream_asU8(): Uint8Array; getErrStream_asB64(): string; setErrStream(value: Uint8Array | string): BurnBootloaderResponse; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BurnBootloaderResponse.AsObject; static toObject(includeInstance: boolean, msg: BurnBootloaderResponse): BurnBootloaderResponse.AsObject; @@ -313,11 +322,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 +348,6 @@ export class ListProgrammersAvailableForUploadResponse extends jspb.Message { setProgrammersList(value: Array): 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 +370,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 +396,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 +428,6 @@ export class SupportedUserFieldsResponse extends jspb.Message { setUserFieldsList(value: Array): 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..937a819c4 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); @@ -28,6 +34,8 @@ 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.UserField', null, global); @@ -63,7 +71,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 +81,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 @@ -759,6 +788,33 @@ proto.cc.arduino.cli.commands.v1.UploadRequest.prototype.clearUserFieldsMap = fu +/** + * 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>} + * @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])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -791,7 +847,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 +893,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 +927,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 +990,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 +1050,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_, 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; }; 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 index ad1daba69..a5e384a95 100644 --- 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 @@ -5,7 +5,6 @@ /* 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"; @@ -36,7 +35,7 @@ interface IDebugServiceService_IGetDebugConfig extends grpc.MethodDefinition; getDebugConfig: grpc.handleUnaryCall; } 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 index 7f353d557..5a8f0d0f6 100644 --- 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 @@ -14,16 +14,13 @@ export class DebugRequest extends jspb.Message { 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; @@ -48,29 +45,22 @@ export class DebugConfigRequest 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): 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; @@ -98,11 +88,9 @@ export class DebugResponse extends jspb.Message { 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; @@ -123,31 +111,23 @@ export namespace DebugResponse { 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; clearToolchainConfigurationMap(): void; - getServerConfigurationMap(): jspb.Map; clearServerConfigurationMap(): void; - serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): GetDebugConfigResponse.AsObject; static toObject(includeInstance: boolean, msg: GetDebugConfigResponse): GetDebugConfigResponse.AsObject; 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 index 12b38a6a5..136919afe 100644 --- 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 @@ -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); 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 index f08b64d21..c5284c159 100644 --- 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 @@ -5,7 +5,6 @@ /* 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 { @@ -14,6 +13,7 @@ interface ISettingsServiceService extends grpc.ServiceDefinition { @@ -61,15 +61,25 @@ interface ISettingsServiceService_IWrite extends grpc.MethodDefinition; responseDeserialize: grpc.deserialize; } +interface ISettingsServiceService_IDelete extends grpc.MethodDefinition { + path: "/cc.arduino.cli.settings.v1.SettingsService/Delete"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} export const SettingsServiceService: ISettingsServiceService; -export interface ISettingsServiceServer { +export interface ISettingsServiceServer extends grpc.UntypedServiceImplementation { getAll: grpc.handleUnaryCall; merge: grpc.handleUnaryCall; getValue: grpc.handleUnaryCall; setValue: grpc.handleUnaryCall; write: grpc.handleUnaryCall; + delete: grpc.handleUnaryCall; } export interface ISettingsServiceClient { @@ -88,6 +98,9 @@ export interface ISettingsServiceClient { 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, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; + delete(request: cc_arduino_cli_settings_v1_settings_pb.DeleteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.DeleteResponse) => void): grpc.ClientUnaryCall; + delete(request: cc_arduino_cli_settings_v1_settings_pb.DeleteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.DeleteResponse) => void): grpc.ClientUnaryCall; + delete(request: cc_arduino_cli_settings_v1_settings_pb.DeleteRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.DeleteResponse) => void): grpc.ClientUnaryCall; } export class SettingsServiceClient extends grpc.Client implements ISettingsServiceClient { @@ -107,4 +120,7 @@ export class SettingsServiceClient extends grpc.Client implements ISettingsServi 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, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.WriteResponse) => void): grpc.ClientUnaryCall; + public delete(request: cc_arduino_cli_settings_v1_settings_pb.DeleteRequest, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.DeleteResponse) => void): grpc.ClientUnaryCall; + public delete(request: cc_arduino_cli_settings_v1_settings_pb.DeleteRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.DeleteResponse) => void): grpc.ClientUnaryCall; + public delete(request: cc_arduino_cli_settings_v1_settings_pb.DeleteRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: cc_arduino_cli_settings_v1_settings_pb.DeleteResponse) => 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 index fd3549cdc..76c399866 100644 --- 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 @@ -19,6 +19,28 @@ '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_DeleteRequest(arg) { + if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.DeleteRequest)) { + throw new Error('Expected argument of type cc.arduino.cli.settings.v1.DeleteRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_settings_v1_DeleteRequest(buffer_arg) { + return cc_arduino_cli_settings_v1_settings_pb.DeleteRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_cc_arduino_cli_settings_v1_DeleteResponse(arg) { + if (!(arg instanceof cc_arduino_cli_settings_v1_settings_pb.DeleteResponse)) { + throw new Error('Expected argument of type cc.arduino.cli.settings.v1.DeleteResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_cc_arduino_cli_settings_v1_DeleteResponse(buffer_arg) { + return cc_arduino_cli_settings_v1_settings_pb.DeleteResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + 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'); @@ -193,5 +215,17 @@ write: { responseSerialize: serialize_cc_arduino_cli_settings_v1_WriteResponse, responseDeserialize: deserialize_cc_arduino_cli_settings_v1_WriteResponse, }, + // Deletes an entry and rewrites the file settings +delete: { + path: '/cc.arduino.cli.settings.v1.SettingsService/Delete', + requestStream: false, + responseStream: false, + requestType: cc_arduino_cli_settings_v1_settings_pb.DeleteRequest, + responseType: cc_arduino_cli_settings_v1_settings_pb.DeleteResponse, + requestSerialize: serialize_cc_arduino_cli_settings_v1_DeleteRequest, + requestDeserialize: deserialize_cc_arduino_cli_settings_v1_DeleteRequest, + responseSerialize: serialize_cc_arduino_cli_settings_v1_DeleteResponse, + responseDeserialize: deserialize_cc_arduino_cli_settings_v1_DeleteResponse, + }, }; 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 index 2453b6879..03fdbf449 100644 --- 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 @@ -10,7 +10,6 @@ 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; @@ -31,7 +30,6 @@ 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; @@ -51,11 +49,9 @@ export namespace MergeRequest { 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; @@ -76,11 +72,9 @@ export namespace GetValueResponse { 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; @@ -119,7 +113,6 @@ 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; @@ -174,7 +167,6 @@ 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; @@ -207,3 +199,40 @@ export namespace WriteResponse { export type AsObject = { } } + +export class DeleteRequest extends jspb.Message { + getKey(): string; + setKey(value: string): DeleteRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DeleteRequest.AsObject; + static toObject(includeInstance: boolean, msg: DeleteRequest): DeleteRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: DeleteRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DeleteRequest; + static deserializeBinaryFromReader(message: DeleteRequest, reader: jspb.BinaryReader): DeleteRequest; +} + +export namespace DeleteRequest { + export type AsObject = { + key: string, + } +} + +export class DeleteResponse extends jspb.Message { + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DeleteResponse.AsObject; + static toObject(includeInstance: boolean, msg: DeleteResponse): DeleteResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: DeleteResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DeleteResponse; + static deserializeBinaryFromReader(message: DeleteResponse, reader: jspb.BinaryReader): DeleteResponse; +} + +export namespace DeleteResponse { + 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 index e5aa89e6c..a00c4ffe8 100644 --- 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 @@ -13,8 +13,16 @@ 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.settings.v1.DeleteRequest', null, global); +goog.exportSymbol('proto.cc.arduino.cli.settings.v1.DeleteResponse', null, global); 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); @@ -235,6 +243,48 @@ if (goog.DEBUG && !COMPILED) { */ proto.cc.arduino.cli.settings.v1.WriteResponse.displayName = 'proto.cc.arduino.cli.settings.v1.WriteResponse'; } +/** + * 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.DeleteRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.settings.v1.DeleteRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.settings.v1.DeleteRequest.displayName = 'proto.cc.arduino.cli.settings.v1.DeleteRequest'; +} +/** + * 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.DeleteResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.cc.arduino.cli.settings.v1.DeleteResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.cc.arduino.cli.settings.v1.DeleteResponse.displayName = 'proto.cc.arduino.cli.settings.v1.DeleteResponse'; +} @@ -1479,4 +1529,235 @@ proto.cc.arduino.cli.settings.v1.WriteResponse.serializeBinaryToWriter = functio }; + + + +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_, 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.DeleteRequest.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.settings.v1.DeleteRequest.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.DeleteRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.settings.v1.DeleteRequest.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.DeleteRequest} + */ +proto.cc.arduino.cli.settings.v1.DeleteRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.settings.v1.DeleteRequest; + return proto.cc.arduino.cli.settings.v1.DeleteRequest.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.DeleteRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.settings.v1.DeleteRequest} + */ +proto.cc.arduino.cli.settings.v1.DeleteRequest.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.DeleteRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.settings.v1.DeleteRequest.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.DeleteRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.settings.v1.DeleteRequest.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.DeleteRequest.prototype.getKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.cc.arduino.cli.settings.v1.DeleteRequest} returns this + */ +proto.cc.arduino.cli.settings.v1.DeleteRequest.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_, 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.DeleteResponse.prototype.toObject = function(opt_includeInstance) { + return proto.cc.arduino.cli.settings.v1.DeleteResponse.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.DeleteResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.settings.v1.DeleteResponse.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.DeleteResponse} + */ +proto.cc.arduino.cli.settings.v1.DeleteResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.cc.arduino.cli.settings.v1.DeleteResponse; + return proto.cc.arduino.cli.settings.v1.DeleteResponse.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.DeleteResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.cc.arduino.cli.settings.v1.DeleteResponse} + */ +proto.cc.arduino.cli.settings.v1.DeleteResponse.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.DeleteResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.cc.arduino.cli.settings.v1.DeleteResponse.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.DeleteResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.cc.arduino.cli.settings.v1.DeleteResponse.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; setDetailsList(value: Array): 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 288966ddc..1f56748cc 100644 --- a/arduino-ide-extension/src/node/config-service-impl.ts +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -1,6 +1,6 @@ -import { promises as fs } from 'fs'; -import { dirname } from 'path'; -import * as yaml from 'js-yaml'; +import { promises as fs } from 'node:fs'; +import { dirname } from 'node:path'; +import yaml from 'js-yaml'; import * as grpc from '@grpc/grpc-js'; import { injectable, inject, named } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; @@ -131,10 +131,6 @@ export class ConfigServiceImpl return this.configChangeEmitter.event; } - async getVersion(): Promise { - return require('../../package.json').arduino?.cli?.version || ''; - } - private async initConfig(): Promise { this.logger.info('>>> Initializing CLI configuration...'); try { @@ -222,8 +218,8 @@ export class ConfigServiceImpl } private async getFallbackCliConfig(): Promise { - const cliPath = await this.daemon.getExecPath(); - const rawJson = await spawnCommand(`"${cliPath}"`, [ + const cliPath = this.daemon.getExecPath(); + const rawJson = await spawnCommand(cliPath, [ 'config', 'dump', 'format', @@ -233,13 +229,8 @@ export class ConfigServiceImpl } private async initCliConfigTo(fsPathToDir: string): Promise { - const cliPath = await this.daemon.getExecPath(); - await spawnCommand(`"${cliPath}"`, [ - 'config', - 'init', - '--dest-dir', - `"${fsPathToDir}"`, - ]); + const cliPath = this.daemon.getExecPath(); + await spawnCommand(cliPath, ['config', 'init', '--dest-dir', fsPathToDir]); } private async mapCliConfigToAppConfig( diff --git a/arduino-ide-extension/src/node/core-client-provider.ts b/arduino-ide-extension/src/node/core-client-provider.ts index 05b32d357..28e8f028c 100644 --- a/arduino-ide-extension/src/node/core-client-provider.ts +++ b/arduino-ide-extension/src/node/core-client-provider.ts @@ -1,4 +1,4 @@ -import { join } from 'path'; +import { join } from 'node:path'; import * as grpc from '@grpc/grpc-js'; import { inject, @@ -530,7 +530,6 @@ function isPrimaryPackageIndexMissingStatus( { directories: { data } }: DefaultCliConfig ): boolean { const predicate = ({ message }: RpcStatus.AsObject) => - message.includes('loading json index file') && 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); @@ -551,8 +550,6 @@ function isLibraryIndexMissingStatus( { directories: { data } }: DefaultCliConfig ): boolean { const predicate = ({ message }: RpcStatus.AsObject) => - message.includes('index file') && - message.includes('reading') && 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); diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index 08cfe4260..a8dfab98b 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -1,13 +1,16 @@ import { FileUri } from '@theia/core/lib/node/file-uri'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { relative } from 'path'; +import { relative } from 'node:path'; import * as jspb from 'google-protobuf'; import { BoolValue } from 'google-protobuf/google/protobuf/wrappers_pb'; -import { ClientReadableStream } from '@grpc/grpc-js'; +import type { ClientReadableStream } from '@grpc/grpc-js'; import { CompilerWarnings, CoreService, CoreError, + CompileSummary, + isCompileSummary, + isUploadResponse, } from '../common/protocol/core-service'; import { CompileRequest, @@ -23,7 +26,13 @@ import { UploadUsingProgrammerResponse, } from './cli-protocol/cc/arduino/cli/commands/v1/upload_pb'; import { ResponseService } from '../common/protocol/response-service'; -import { OutputMessage, Port } from '../common/protocol'; +import { + resolveDetectedPort, + OutputMessage, + PortIdentifier, + Port, + UploadResponse as ApiUploadResponse, +} 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'; @@ -34,47 +43,37 @@ 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 type { Mutable } from '@theia/core/lib/common/types'; +import { BoardDiscovery, createApiPort } from './board-discovery'; namespace Uploadable { export type Request = UploadRequest | UploadUsingProgrammerRequest; export type Response = UploadResponse | UploadUsingProgrammerResponse; } +type CompileSummaryFragment = Partial>; + @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 { const coreClient = await this.coreClient; const { client, instance } = coreClient; - let buildPath: string | undefined = undefined; + const compileSummary = {}; 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( progressHandler, - buildPathHandler + compileSummaryHandler ); const request = this.compileRequest(options, instance); return new Promise((resolve, reject) => { @@ -111,31 +110,35 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { .on('end', resolve); }).finally(() => { handler.dispose(); - if (!buildPath) { + if (!isCompileSummary(compileSummary)) { console.error( - `Have not received the build path from the CLI while running the compilation.` + `Have not received the full compile summary from the CLI while running the compilation. ${JSON.stringify( + compileSummary + )}` ); } else { - this.fireBuildDidComplete(FileUri.create(buildPath).toString()); + this.fireBuildDidComplete(compileSummary); } }); } // This executes on the frontend, the VS Code extension receives it, and sends an `ino/buildDidComplete` notification to the language server. - private fireBuildDidComplete(buildOutputUri: string): void { + private fireBuildDidComplete(compileSummary: CompileSummary): void { const params = { - buildOutputUri, + ...compileSummary, }; console.info( `Executing 'arduino.languageserver.notifyBuildDidComplete' with ${JSON.stringify( - params + params.buildOutputUri )}` ); this.commandService .executeCommand('arduino.languageserver.notifyBuildDidComplete', params) .catch((err) => console.error( - `Unexpected error when firing event on build did complete. ${buildOutputUri}`, + `Unexpected error when firing event on build did complete. ${JSON.stringify( + params.buildOutputUri + )}`, err ) ); @@ -173,7 +176,7 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { return request; } - upload(options: CoreService.Options.Upload): Promise { + upload(options: CoreService.Options.Upload): Promise { const { usingProgrammer } = options; return this.doUpload( options, @@ -202,14 +205,45 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { ) => (request: REQ) => ClientReadableStream, errorCtor: ApplicationError.Constructor, task: string - ): Promise { + ): Promise { + const portBeforeUpload = options.port; + const uploadResponseFragment: Mutable> = { + 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 grpcCall = responseFactory(client); return this.notifyUploadWillStart(options).then(() => - new Promise((resolve, reject) => { + new Promise((resolve, reject) => { grpcCall(this.initUploadRequest(request, options, instance)) .on('data', handler.onData) .on('error', (error) => { @@ -235,10 +269,28 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { ); } }) - .on('end', resolve); + .on('end', () => { + if (isUploadResponse(uploadResponseFragment)) { + resolve(uploadResponseFragment); + } else { + reject( + new Error( + `Could not detect the port after the upload. Upload options were: ${JSON.stringify( + options + )}, upload response was: ${JSON.stringify( + uploadResponseFragment + )}` + ) + ); + } + }); }).finally(async () => { handler.dispose(); - await this.notifyUploadDidFinish(options); + await this.notifyUploadDidFinish( + Object.assign(options, { + afterPort: uploadResponseFragment.portAfterUpload, + }) + ); }) ); } @@ -303,7 +355,9 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { .on('end', resolve); }).finally(async () => { handler.dispose(); - await this.notifyUploadDidFinish(options); + await this.notifyUploadDidFinish( + Object.assign(options, { afterPort: options.port }) + ); }) ); } @@ -380,21 +434,25 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { port, }: { fqbn?: string | undefined; - port?: Port | undefined; + port?: PortIdentifier; }): Promise { - 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; + port?: PortIdentifier; + afterPort?: PortIdentifier; }): Promise { - this.boardDiscovery.setUploadInProgress(false); - return this.monitorManager.notifyUploadFinished(fqbn, port); + if (fqbn && port && afterPort) { + return this.monitorManager.notifyUploadFinished(fqbn, port, afterPort); + } } private mergeSourceOverrides( @@ -411,15 +469,26 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { } } - 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 +530,62 @@ namespace StreamingResponse { readonly handlers?: ((response: R) => void)[]; } } + +function updateCompileSummary( + compileSummary: CompileSummaryFragment, + response: CompileResponse +): CompileSummaryFragment { + const buildPath = response.getBuildPath(); + if (buildPath) { + compileSummary.buildPath = buildPath; + compileSummary.buildOutputUri = FileUri.create(buildPath).toString(); + } + const executableSectionsSize = response.getExecutableSectionsSizeList(); + if (executableSectionsSize) { + compileSummary.executableSectionsSize = executableSectionsSize.map((item) => + item.toObject(false) + ); + } + const usedLibraries = response.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), + compatibleWith: object.compatibleWithMap.reduce((acc, [key, value]) => { + acc[key] = value; + return acc; + }, {} as Record), + } as const; + const mutable = >>library; + delete mutable.architecturesList; + delete mutable.typesList; + delete mutable.examplesList; + delete mutable.providesIncludesList; + delete mutable.propertiesMap; + delete mutable.compatibleWithMap; + return library; + }); + } + const boardPlatform = response.getBoardPlatform(); + if (boardPlatform) { + compileSummary.buildPlatform = boardPlatform.toObject(false); + } + const buildPlatform = response.getBuildPlatform(); + if (buildPlatform) { + compileSummary.buildPlatform = buildPlatform.toObject(false); + } + const buildProperties = response.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 83cca1e1a..1199f729e 100644 --- a/arduino-ide-extension/src/node/examples-service-impl.ts +++ b/arduino-ide-extension/src/node/examples-service-impl.ts @@ -3,8 +3,8 @@ import { injectable, postConstruct, } from '@theia/core/shared/inversify'; -import { join } from 'path'; -import * as fs from 'fs'; +import { join } from 'node:path'; +import fs from 'node:fs'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { SketchRef, @@ -15,6 +15,7 @@ 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; @@ -64,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'), diff --git a/arduino-ide-extension/src/node/exec-util.ts b/arduino-ide-extension/src/node/exec-util.ts index 76ba08aed..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 { - 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((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 { return new Promise((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)); diff --git a/arduino-ide-extension/src/node/executable-service-impl.ts b/arduino-ide-extension/src/node/executable-service-impl.ts index f731387d8..9501079d1 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 { 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/i18n/arduino-localization-contribution.ts b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts index 686d28bd7..224d073bf 100644 --- a/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts +++ b/arduino-ide-extension/src/node/i18n/arduino-localization-contribution.ts @@ -3,45 +3,56 @@ import { LocalizationRegistry, } from '@theia/core/lib/node/i18n/localization-contribution'; import { injectable } from '@theia/core/shared/inversify'; -import { join } from 'path'; +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 { - // 0. index: locale - // 1. index: optional JSON file to `require` (if differs from the locale) + // 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: ReadonlyArray<[string, string?]> = [ - ['bg'], - ['cs'], - ['de'], - ['es'], - ['fr'], - ['hu'], - // ['id'], Does not have Transifex translations, but has a VS Code language pack available on Open VSX. - ['it'], - ['ja'], - ['ko'], - ['nl'], - ['pl'], - ['pt-br', 'pt'], - ['ru'], - ['tr'], - ['uk', 'uk_UA'], - ['zh-cn', 'zh'], - ]; + private readonly locales: Readonly> = { + 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, + }; async registerLocalizations(registry: LocalizationRegistry): Promise { - for (const [locale, jsonFilename] of this.locales) { - registry.registerLocalizationFromRequire( - locale, - require(join( - __dirname, - `../../../build/i18n/${jsonFilename ?? locale}.json` - )) - ); + for (const [locale, module] of Object.entries(this.locales)) { + registry.registerLocalizationFromRequire(locale, module); } } } diff --git a/arduino-ide-extension/src/node/is-temp-sketch.ts b/arduino-ide-extension/src/node/is-temp-sketch.ts index 3bb3c4bda..dc65a2faf 100644 --- a/arduino-ide-extension/src/node/is-temp-sketch.ts +++ b/arduino-ide-extension/src/node/is-temp-sketch.ts @@ -1,5 +1,5 @@ -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'; diff --git a/arduino-ide-extension/src/node/library-service-impl.ts b/arduino-ide-extension/src/node/library-service-impl.ts index 1bb836dcc..afdfae052 100644 --- a/arduino-ide-extension/src/node/library-service-impl.ts +++ b/arduino-ide-extension/src/node/library-service-impl.ts @@ -8,7 +8,10 @@ import { sortComponents, SortGroup, } from '../common/protocol'; -import { Installable } from '../common/protocol/installable'; +import { + Installable, + libraryInstallFailed, +} from '../common/protocol/installable'; import { LibraryDependency, LibraryLocation, @@ -34,6 +37,7 @@ import { } from './cli-protocol/cc/arduino/cli/commands/v1/lib_pb'; import { CoreClientAware } from './core-client-provider'; import { ExecuteWithProgress } from './grpc-progressible'; +import { ServiceError } from './service-error'; @injectable() export class LibraryServiceImpl @@ -221,8 +225,8 @@ export class LibraryServiceImpl { name: library.getName(), installedVersion, - description: library.getSentence(), - summary: library.getParagraph(), + description: library.getParagraph(), + summary: library.getSentence(), moreInfoLink: library.getWebsite(), includes: library.getProvidesIncludesList(), location: this.mapLocation(library.getLocation()), @@ -272,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( @@ -344,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`, @@ -462,9 +469,9 @@ function toLibrary( 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(), }; 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 079b85d48..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,13 +2,11 @@ import { inject, injectable } from '@theia/core/shared/inversify'; import { MonitorManagerProxy, MonitorManagerProxyClient, + 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 { diff --git a/arduino-ide-extension/src/node/monitor-manager.ts b/arduino-ide-extension/src/node/monitor-manager.ts index ea63aa8cb..9931e3937 100644 --- a/arduino-ide-extension/src/node/monitor-manager.ts +++ b/arduino-ide-extension/src/node/monitor-manager.ts @@ -4,15 +4,15 @@ import { AlreadyConnectedError, Board, BoardsService, + MonitorSettings, + PluggableMonitorSettings, Port, + PortIdentifier, + portIdentifierEquals, } from '../common/protocol'; import { CoreClientAware } from './core-client-provider'; import { MonitorService } from './monitor-service'; import { MonitorServiceFactory } from './monitor-service-factory'; -import { - MonitorSettings, - PluggableMonitorSettings, -} from './monitor-settings/monitor-settings-provider'; type MonitorID = string; @@ -182,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 { - 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 { const monitorID = this.monitorID(fqbn, port); this.addToMonitorIDsByUploadState('uploadInProgress', monitorID); @@ -206,41 +200,44 @@ 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 + fqbn: string | undefined, + beforePort: PortIdentifier, + afterPort: PortIdentifier ): Promise { 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) { + 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); } @@ -258,7 +255,7 @@ export class MonitorManager extends CoreClientAware { 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]; @@ -357,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 ff7a9019f..e6c3172f1 100644 --- a/arduino-ide-extension/src/node/monitor-service.ts +++ b/arduino-ide-extension/src/node/monitor-service.ts @@ -7,7 +7,6 @@ import { nls, } from '@theia/core'; import { inject, named, postConstruct } from '@theia/core/shared/inversify'; -import { diff, Operation } from 'just-diff'; import { Board, Port, @@ -17,6 +16,8 @@ import { createNotConnectedError, createConnectionFailedError, isMonitorConnected, + MonitorSettings, + PluggableMonitorSettings, } from '../common/protocol'; import { EnumerateMonitorPortSettingsRequest, @@ -29,11 +30,7 @@ import { import { CoreClientAware } from './core-client-provider'; import { WebSocketProvider } from './web-socket/web-socket-provider'; import { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_pb'; -import { - MonitorSettings, - PluggableMonitorSettings, - MonitorSettingsProvider, -} from './monitor-settings/monitor-settings-provider'; +import { MonitorSettingsProvider } from './monitor-settings/monitor-settings-provider'; import { Deferred, retry, @@ -583,7 +580,7 @@ export class MonitorService extends CoreClientAware implements Disposable { return; } - const diffConfig = this.maybeUpdatePortConfigSnapshot(config); + 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}.` @@ -614,9 +611,9 @@ export class MonitorService extends CoreClientAware implements Disposable { * 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 maybeUpdatePortConfigSnapshot( + private async maybeUpdatePortConfigSnapshot( otherPortConfig: MonitorPortConfiguration - ): MonitorPortConfiguration | undefined { + ): Promise { const otherPortConfigSnapshot = MonitorPortConfiguration.toObject( false, otherPortConfig @@ -629,7 +626,8 @@ export class MonitorService extends CoreClientAware implements Disposable { ); } - const snapshotDiff = diff( + const justDiff = await import('just-diff'); + const snapshotDiff = justDiff.diff( this.currentPortConfigSnapshot, otherPortConfigSnapshot ); @@ -676,7 +674,7 @@ export class MonitorService extends CoreClientAware implements Disposable { } private isValidMonitorPortSettingChange(entry: { - op: Operation; + op: string; path: (string | number)[]; value: unknown; }): entry is { 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 4a6a937d1..a9df01209 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,5 +1,5 @@ -import * as fs from 'fs'; -import { join } from 'path'; +import fs from 'node:fs'; +import { join } from 'node:path'; import { injectable, inject, @@ -8,16 +8,14 @@ import { import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { FileUri } from '@theia/core/lib/node/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'; @@ -40,19 +38,21 @@ export class MonitorSettingsProviderImpl implements MonitorSettingsProvider { private pluggableMonitorSettingsPath: string; @postConstruct() - protected async init(): Promise { - // 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( 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 293751781..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,10 +1,4 @@ -import { MonitorState, PluggableMonitorSetting } from '../../common/protocol'; - -export type PluggableMonitorSettings = Record; -export interface MonitorSettings { - pluggableMonitorSettings?: PluggableMonitorSettings; - monitorUISettings?: Partial; -} +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/notification-service-server.ts b/arduino-ide-extension/src/node/notification-service-server.ts index ce6a96304..cd3cac91e 100644 --- a/arduino-ide-extension/src/node/notification-service-server.ts +++ b/arduino-ide-extension/src/node/notification-service-server.ts @@ -2,7 +2,6 @@ import { injectable } from '@theia/core/shared/inversify'; import type { NotificationServiceServer, NotificationServiceClient, - AttachedBoardsChangeEvent, BoardsPackage, LibraryPackage, ConfigState, @@ -11,6 +10,7 @@ import type { IndexUpdateWillStartParams, IndexUpdateDidCompleteParams, IndexUpdateDidFailParams, + DetectedPorts, } from '../common/protocol'; @injectable() @@ -69,9 +69,9 @@ 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) ); } 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 2a0899491..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 '@theia/core/shared/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/settings-reader.ts b/arduino-ide-extension/src/node/settings-reader.ts index d6ab15811..c58e9751f 100644 --- a/arduino-ide-extension/src/node/settings-reader.ts +++ b/arduino-ide-extension/src/node/settings-reader.ts @@ -1,13 +1,13 @@ import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { promises as fs } from 'fs'; +import { promises as fs } from 'node:fs'; import { parse as parseJsonc, ParseError, printParseErrorCode, } from 'jsonc-parser'; -import { join } from 'path'; +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) diff --git a/arduino-ide-extension/src/node/sketches-service-impl.ts b/arduino-ide-extension/src/node/sketches-service-impl.ts index c6fd56a8a..0fe8a2158 100644 --- a/arduino-ide-extension/src/node/sketches-service-impl.ts +++ b/arduino-ide-extension/src/node/sketches-service-impl.ts @@ -1,12 +1,12 @@ import { injectable, inject, named } from '@theia/core/shared/inversify'; -import { promises as fs, realpath, lstat, Stats, constants } from 'fs'; -import * as os from 'os'; -import * as temp from 'temp'; -import * as path from 'path'; -import * as glob from 'glob'; -import * as crypto from 'crypto'; -import * as PQueue from 'p-queue'; -import { Mutable } from '@theia/core/lib/common/types'; +import { promises as fs, realpath, lstat, Stats, constants } from 'node:fs'; +import os from 'node:os'; +import temp from 'temp'; +import path from 'node:path'; +import glob from 'glob'; +import crypto from 'node:crypto'; +import PQueue from 'p-queue'; +import type { Mutable } from '@theia/core/lib/common/types'; 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'; @@ -34,7 +34,7 @@ import { TempSketchPrefix, Win32DriveRegex, } from './is-temp-sketch'; -import { join } from 'path'; +import { join } from 'node:path'; import { ErrnoException } from './utils/errors'; import { isWindows } from '@theia/core/lib/common/os'; import { @@ -43,7 +43,6 @@ import { startsWithUpperCase, } from '../common/utils'; import { SettingsReader } from './settings-reader'; -import cpy = require('cpy'); const RecentSketches = 'recent-sketches.json'; const DefaultIno = `void setup() { @@ -74,19 +73,14 @@ export class SketchesServiceImpl @inject(ILogger) @named('sketches-service') private readonly logger: ILogger; - @inject(ConfigServiceImpl) private readonly configService: ConfigServiceImpl; - @inject(NotificationServiceServer) private readonly notificationService: NotificationServiceServer; - @inject(EnvVariablesServer) private readonly envVariableServer: EnvVariablesServer; - @inject(IsTempSketch) private readonly isTempSketch: IsTempSketch; - @inject(SettingsReader) private readonly settingsReader: SettingsReader; @@ -134,11 +128,11 @@ export class SketchesServiceImpl uri: string, detectInvalidSketchNameError = true ): Promise { - const { client, instance } = await this.coreClient; + const { client } = await this.coreClient; const req = new LoadSketchRequest(); const requestSketchPath = FileUri.fsPath(uri); req.setSketchPath(requestSketchPath); - req.setInstance(instance); + // 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(); lstat(requestSketchPath, (err, result) => err ? stat.resolve(err) : stat.resolve(result) @@ -444,7 +438,7 @@ export class SketchesServiceImpl * For example, on Windows, instead of getting an [8.3 filename](https://en.wikipedia.org/wiki/8.3_filename), callers will get a fully resolved path. * `C:\\Users\\KITTAA~1\\AppData\\Local\\Temp\\.arduinoIDE-unsaved2022615-21100-iahybb.yyvh\\sketch_jul15a` will be `C:\\Users\\kittaakos\\AppData\\Local\\Temp\\.arduinoIDE-unsaved2022615-21100-iahybb.yyvh\\sketch_jul15a` */ - createTempFolder(): Promise { + private createTempFolder(): Promise { return new Promise((resolve, reject) => { temp.mkdir({ prefix: TempSketchPrefix }, (createError, dirPath) => { if (createError) { @@ -516,20 +510,23 @@ export class SketchesServiceImpl } const sourceFolderBasename = path.basename(source); const destinationFolderBasename = path.basename(destination); - let filter: cpy.Options['filter']; + let filter; if (onlySketchFiles) { const sketchFilePaths = Sketch.uris(sketch).map(FileUri.fsPath); - filter = (file) => sketchFilePaths.includes(file.path); + filter = (file: { path: string }) => sketchFilePaths.includes(file.path); } else { filter = () => true; } - await cpy(source, destination, { + const cpyModule = await import('cpy'); + const cpy = cpyModule.default; + await cpy(sourceFolderBasename, destination, { rename: (basename) => sourceFolderBasename !== destinationFolderBasename && basename === `${sourceFolderBasename}.ino` ? `${destinationFolderBasename}.ino` : basename, filter, + cwd: path.dirname(source), }); const copiedSketch = await this.doLoadSketch(destinationUri, false); return copiedSketch; @@ -680,6 +677,7 @@ async function isInvalidSketchNameError( * * 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`. @@ -692,7 +690,7 @@ export async function isAccessibleSketchPath( try { stats = await fs.stat(path); } catch (err) { - if (ErrnoException.isENOENT(err)) { + if (ErrnoException.isENOENT(err) || ErrnoException.isUNKNOWN(err)) { return undefined; } throw err; 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..40bf3662b 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/node/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 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 extends TheiaEnvVariablesServerImpl { - protected override readonly configDirUri = Promise.resolve( - FileUri.create( - join(homedir(), BackendApplicationConfigProvider.get().configDirName) - ).toString() - ); +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 { + return process.execPath; + } + + async getVariables(): Promise { + return Object.keys(this.envs).map((key) => this.envs[key]); + } + + async getValue(key: string): Promise { + if (isWindows) { + key = key.toLowerCase(); + } + return this.envs[key]; + } + + async getConfigDirUri(): Promise { + return this.configDirUriProvider.configDirUri().toString(); + } + + async getHomeDirUri(): Promise { + return this.homeDirUri; + } + + async getDrives(): Promise { + 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/nsfw-watcher/nsfw-bindings.ts b/arduino-ide-extension/src/node/theia/filesystem/nsfw-bindings.ts similarity index 92% rename from arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-bindings.ts rename to arduino-ide-extension/src/node/theia/filesystem/nsfw-bindings.ts index 77cdd11d7..176f52cf9 100644 --- a/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/nsfw-bindings.ts +++ b/arduino-ide-extension/src/node/theia/filesystem/nsfw-bindings.ts @@ -1,4 +1,4 @@ -import { join } from 'path'; +import { join } from 'node:path'; import { interfaces } from '@theia/core/shared/inversify'; import { NsfwFileSystemWatcherServiceProcessOptions, @@ -8,13 +8,13 @@ import { import { FileSystemWatcherService } from '@theia/filesystem/lib/common/filesystem-watcher-protocol'; import { NsfwFileSystemWatcherServerOptions } from '@theia/filesystem/lib/node/nsfw-watcher/nsfw-filesystem-service'; import { FileSystemWatcherServiceDispatcher } from '@theia/filesystem/lib/node/filesystem-watcher-dispatcher'; -import { NoDelayDisposalTimeoutNsfwFileSystemWatcherService } from './nsfw-filesystem-service'; +import { NoDelayDisposalTimeoutNsfwFileSystemWatcherService } from './nsfw-watcher/nsfw-filesystem-service'; export function rebindNsfwFileSystemWatcher(rebind: interfaces.Rebind): void { rebind( NsfwFileSystemWatcherServiceProcessOptions ).toConstantValue({ - entryPoint: join(__dirname, 'index.js'), + entryPoint: join(__dirname, 'nsfw-watcher'), }); rebind(FileSystemWatcherService) .toDynamicValue((context) => diff --git a/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/index.ts b/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/index.ts index 93e0d267a..472019ca1 100644 --- a/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/index.ts +++ b/arduino-ide-extension/src/node/theia/filesystem/nsfw-watcher/index.ts @@ -1,5 +1,5 @@ import * as yargs from '@theia/core/shared/yargs'; -import { JsonRpcProxyFactory } from '@theia/core'; +import { JsonRpcProxyFactory } from '@theia/core/lib/common/messaging/proxy-factory'; import { NoDelayDisposalTimeoutNsfwFileSystemWatcherService } from './nsfw-filesystem-service'; import type { IPCEntryPoint } from '@theia/core/lib/node/messaging/ipc-protocol'; import type { FileSystemWatcherServiceClient } from '@theia/filesystem/lib/common/filesystem-watcher-protocol'; 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 index 19c46ead1..32694d606 100644 --- a/arduino-ide-extension/src/node/theia/plugin-ext/plugin-deployer.ts +++ b/arduino-ide-extension/src/node/theia/plugin-ext/plugin-deployer.ts @@ -10,8 +10,8 @@ import { } 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 'fs'; -import { isAbsolute, resolve } from 'path'; +import { constants, promises as fs } from 'node:fs'; +import { isAbsolute, resolve } from 'node:path'; @injectable() export class LocalDirectoryPluginDeployerResolverWithFallback extends LocalDirectoryPluginDeployerResolver { 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 index d68f34c9b..1737dd70e 100644 --- a/arduino-ide-extension/src/node/theia/plugin-ext/plugin-reader.ts +++ b/arduino-ide-extension/src/node/theia/plugin-ext/plugin-reader.ts @@ -72,6 +72,14 @@ const cortexDebugFilter: PluginContributionFilter = ( } } } + 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; + } + } + } return contribution; }; 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..332eedc7a 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,4 +1,4 @@ -import { promises as fs, constants } from 'fs'; +import { promises as fs, constants } from 'node:fs'; import { injectable, inject } from '@theia/core/shared/inversify'; import { DefaultWorkspaceServer as TheiaDefaultWorkspaceServer } from '@theia/workspace/lib/node/default-workspace-server'; import { SketchesService } from '../../../common/protocol'; diff --git a/arduino-ide-extension/src/node/utils/errors.ts b/arduino-ide-extension/src/node/utils/errors.ts index 952c43763..83ad84f5e 100644 --- a/arduino-ide-extension/src/node/utils/errors.ts +++ b/arduino-ide-extension/src/node/utils/errors.ts @@ -15,7 +15,16 @@ export namespace ErrnoException { } /** - * (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. + * _(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 @@ -24,11 +33,22 @@ export namespace ErrnoException { } /** - * (Not a directory): A component of the given pathname existed, but was not a directory as expected. Commonly raised by `fs.readdir`. + * _(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 b32559651..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 '@theia/core/shared/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 f5daf5b47..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 '@theia/core/shared/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; onClientsNumberChanged: Event; 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..039111474 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/board-service-provider.test.ts @@ -0,0 +1,426 @@ +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 { MockLogger } from '@theia/core/lib/common/test/mock-logger'; +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 { bindCommon, ConsoleLogger } from '../common/common-test-bindings'; +import { + detectedPort, + esp32S3DevModule, + mkr1000, + mkr1000SerialPort, + undiscoveredSerialPort, + uno, + unoSerialPort, +} from '../common/fixtures'; + +disableJSDOM(); + +describe('board-service-provider', () => { + let toDisposeAfterEach: DisposableCollection; + let boardsServiceProvider: BoardsServiceProvider; + let notificationCenter: NotificationCenter; + + beforeEach(async () => { + const container = createContainer(); + container.get( + FrontendApplicationStateService + ).state = 'ready'; + boardsServiceProvider = container.get( + BoardsServiceProvider + ); + notificationCenter = container.get(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 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) => { + bindCommon(bind); + bind(MessageService).toConstantValue({}); + bind(BoardsService).toConstantValue({ + 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({}); + bind(LocalStorageService).toSelf().inSingletonScope(); + bind(WindowService).toConstantValue({}); + bind(StorageService).toService(LocalStorageService); + bind(BoardsServiceProvider).toSelf().inSingletonScope(); + // 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); + }) + ); + 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; -// let boardsService: IMock; -// let boardsServiceClient: IMock; -// let responseService: IMock; -// let boardsManagerFrontendContribution: IMock; -// let boardsManagerWidget: IMock>; - -// let testContainer: Container; - -// beforeEach(() => { -// testContainer = new Container(); -// messageService = Mock.ofType(); -// boardsService = Mock.ofType(); -// boardsServiceClient = Mock.ofType(); -// responseService = Mock.ofType(); -// boardsManagerFrontendContribution = -// Mock.ofType(); -// boardsManagerWidget = Mock.ofType>(); - -// 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/browser-test-bindings.ts b/arduino-ide-extension/src/test/browser/browser-test-bindings.ts new file mode 100644 index 000000000..9165765f7 --- /dev/null +++ b/arduino-ide-extension/src/test/browser/browser-test-bindings.ts @@ -0,0 +1,8 @@ +import { Container, ContainerModule } from '@theia/core/shared/inversify'; +import { bindCommon } from '../common/common-test-bindings'; + +export function createBaseContainer(): Container { + const container = new Container({ defaultScope: 'Singleton' }); + container.load(new ContainerModule((bind) => bindCommon(bind))); + return container; +} 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 index 1f1228ce6..c84eade55 100644 --- a/arduino-ide-extension/src/test/browser/connection-status-service.test.ts +++ b/arduino-ide-extension/src/test/browser/connection-status-service.test.ts @@ -20,25 +20,41 @@ 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 }); + 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 }); + 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 }); + 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 }); + 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.test.ts b/arduino-ide-extension/src/test/browser/create-api.test.ts index a18609cb1..a9b52c11b 100644 --- a/arduino-ide-extension/src/test/browser/create-api.test.ts +++ b/arduino-ide-extension/src/test/browser/create-api.test.ts @@ -1,7 +1,11 @@ -import { Container, ContainerModule } from '@theia/core/shared/inversify'; +import { + Container, + ContainerModule, + injectable, +} from '@theia/core/shared/inversify'; import { assert, expect } from 'chai'; import fetch from 'cross-fetch'; -import { posix } from 'path'; +import { posix } from 'node:path'; import { v4 } from 'uuid'; import { ArduinoPreferences } from '../../browser/arduino-preferences'; import { AuthenticationClientService } from '../../browser/auth/authentication-client-service'; @@ -11,7 +15,7 @@ import { Create, CreateError } 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'; -import queryString = require('query-string'); +import queryString from 'query-string'; /* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ @@ -19,13 +23,14 @@ import queryString = require('query-string'); const timeout = 60 * 1_000; describe('create-api', () => { - let createApi: CreateApi; + let createApi: TestCreateApi; before(async function () { this.timeout(timeout); try { const accessToken = await login(); - createApi = createContainer(accessToken).get(CreateApi); + createApi = + createContainer(accessToken).get(TestCreateApi); } catch (err) { if (err instanceof LoginFailed) { return this.skip(); @@ -43,7 +48,7 @@ describe('create-api', () => { const container = new Container({ defaultScope: 'Singleton' }); container.load( new ContainerModule((bind) => { - bind(CreateApi).toSelf().inSingletonScope(); + bind(TestCreateApi).toSelf().inSingletonScope(); bind(SketchCache).toSelf().inSingletonScope(); bind(AuthenticationClientService).toConstantValue(< AuthenticationClientService @@ -285,6 +290,47 @@ describe('create-api', () => { 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 = 50; // https://github.com/arduino/arduino-ide/pull/875 + const sketchCount = maxLimit + diff; + const sketchNames = [...Array(sketchCount).keys()].map(() => v4()); + + await sketchNames + .map((name) => createApi.createSketch(toPosix(name), content)) + .reduce(async (acc, curr) => { + await acc; + return curr; + }, Promise.resolve() as Promise); + + createApi.resetRequestRecording(); + const sketches = await createApi.sketches(); + 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. @@ -332,3 +378,44 @@ class LoginFailed extends Error { 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/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('onematchOnetwo'); + const expected = ['one', { textContent: 'matchOne', bold: true }, 'two']; + expect(actual).to.be.deep.equal(expected); + }); + + it('should handle starting bold tags', () => { + const actual = splitByBoldTag( + 'matchOneonematchTwo two matchThree 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( + 'matchOneonematchTwo two matchThree 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 no matches', () => { + const actual = splitByBoldTag('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 16256f3ab..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, }; diff --git a/arduino-ide-extension/src/test/browser/theming.test.ts b/arduino-ide-extension/src/test/browser/theming.test.ts index 89265e61a..418176de5 100644 --- a/arduino-ide-extension/src/test/browser/theming.test.ts +++ b/arduino-ide-extension/src/test/browser/theming.test.ts @@ -10,6 +10,7 @@ import { arduinoThemeTypeOf, darkThemeLabel, deprecatedThemeLabel, + hcLightThemeLabel, hcThemeLabel, lightThemeLabel, themeLabelForSettings, @@ -52,15 +53,17 @@ describe('theming', () => { testTheme, BuiltinThemeProvider.hcTheme, anotherTestTheme, + BuiltinThemeProvider.hcLightTheme, ], currentTheme: () => BuiltinThemeProvider.hcTheme, }).reduce((acc, curr) => acc.concat(curr), []); - expect(actual.length).to.be.equal(5); + 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.hcTheme.id); - expect(actual[3].id).to.be.equal(anotherTestTheme.id); - expect(actual[4].id).to.be.equal(testTheme.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', () => { @@ -69,6 +72,7 @@ describe('theming', () => { BuiltinThemeProvider.hcTheme, BuiltinThemeProvider.lightTheme, BuiltinThemeProvider.darkTheme, + BuiltinThemeProvider.hcLightTheme, ArduinoThemes.dark, testTheme, anotherTestTheme, @@ -76,18 +80,20 @@ describe('theming', () => { ], currentTheme: () => testTheme, }).reduce((acc, curr) => acc.concat(curr), []); - expect(actual.length).to.be.equal(5); + 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.hcTheme.id); - expect(actual[3].id).to.be.equal(anotherTestTheme.id); - expect(actual[4].id).to.be.equal(testTheme.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, @@ -99,15 +105,16 @@ describe('theming', () => { ], currentTheme: () => BuiltinThemeProvider.lightTheme, }).reduce((acc, curr) => acc.concat(curr), []); - expect(actual.length).to.be.equal(8); + 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.hcTheme.id); - expect(actual[3].id).to.be.equal(anotherTestTheme.id); - expect(actual[4].id).to.be.equal(testTheme.id); - expect(actual[5].id).to.be.equal(anotherDarkTestTheme.id); - expect(actual[6].id).to.be.equal(darkTestTheme.id); - expect(actual[7].id).to.be.equal(BuiltinThemeProvider.lightTheme.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', () => { @@ -115,6 +122,7 @@ describe('theming', () => { themes: () => [ ArduinoThemes.dark, ArduinoThemes.light, + BuiltinThemeProvider.hcLightTheme, testTheme, BuiltinThemeProvider.hcTheme, anotherTestTheme, @@ -126,7 +134,7 @@ describe('theming', () => { currentTheme: () => BuiltinThemeProvider.lightTheme, }); expect(actual.length).to.be.equal(3); - expect(actual[0].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); }); @@ -137,6 +145,7 @@ describe('theming', () => { [ [BuiltinThemeProvider.lightTheme, 'deprecated'], [BuiltinThemeProvider.darkTheme, 'deprecated'], + [BuiltinThemeProvider.hcLightTheme, 'built-in'], [BuiltinThemeProvider.hcTheme, 'built-in'], [ArduinoThemes.light, 'built-in'], [ArduinoThemes.dark, 'built-in'], @@ -146,7 +155,7 @@ describe('theming', () => { [anotherDarkTestTheme, 'user'], ] as [Theme, ArduinoThemeType][] ).map(([theme, expected]) => - it(`should detect the '${theme.label}' theme as '${expected}' theme`, () => + it(`should detect the '${theme.label}' theme as a '${expected}' theme`, () => expect(arduinoThemeTypeOf(theme)).to.be.equal(expected)) ); }); @@ -163,6 +172,7 @@ describe('theming', () => { deprecatedThemeLabel(BuiltinThemeProvider.darkTheme), ], [BuiltinThemeProvider.hcTheme, hcThemeLabel], + [BuiltinThemeProvider.hcLightTheme, hcLightThemeLabel], [ArduinoThemes.light, lightThemeLabel], [ArduinoThemes.dark, darkThemeLabel], [testTheme, userThemeLabel(testTheme)], diff --git a/arduino-ide-extension/src/test/browser/workspace-commands.test.ts b/arduino-ide-extension/src/test/browser/workspace-commands.test.ts index 0676ed77a..cc661e0c9 100644 --- a/arduino-ide-extension/src/test/browser/workspace-commands.test.ts +++ b/arduino-ide-extension/src/test/browser/workspace-commands.test.ts @@ -89,6 +89,7 @@ describe('workspace-commands', () => { const child: FileStat = { isFile: true, isDirectory: false, + isReadonly: false, isSymbolicLink: false, resource: new URI('sketch/sketch.ino'), name: 'sketch.ino', @@ -96,6 +97,7 @@ describe('workspace-commands', () => { const parent: FileStat = { isFile: false, isDirectory: true, + isReadonly: false, isSymbolicLink: false, resource: new URI('sketch'), name: 'sketch', 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 = 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 = 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 = 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 d2cae5a53..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,8 +1,8 @@ -import { Deferred } from '@theia/core/lib/common/promise-util'; -import { Mutable } from '@theia/core/lib/common/types'; +import type { Mutable } from '@theia/core/lib/common/types'; import { expect } from 'chai'; import { - AttachedBoardsChangeEvent, + boardIdentifierEquals, + boardIdentifierComparator, BoardInfo, getBoardInfo, noNativeSerialPort, @@ -11,88 +11,116 @@ import { 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 = { - 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' }, - ], - }, - 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' }, - ], - }, - }; - 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' + 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'; @@ -112,7 +140,7 @@ describe('boards-service', () => { }); it('should handle when no port is selected', async () => { - const info = await getBoardInfo(undefined, never()); + const info = await getBoardInfo(createBoardList({})); expect(info).to.be.equal(selectPortForInfo); }); @@ -125,7 +153,11 @@ describe('boards-service', () => { protocolLabel: firstToUpperCase(protocol), protocol, }; - const info = await getBoardInfo(selectedPort, never()); + const boardList = createBoardList( + { [Port.keyOf(selectedPort)]: { port: selectedPort } }, + { selectedPort, selectedBoard: undefined } + ); + const info = await getBoardInfo(boardList); expect(info).to.be.equal(nonSerialPort); }) ); @@ -140,18 +172,26 @@ describe('boards-service', () => { ]; for (const properties of insufficientProperties) { const port = selectedPort(properties); - const info = await getBoardInfo(port, { - [Port.keyOf(port)]: [port, []], - }); + 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 info = await getBoardInfo(port, { - [Port.keyOf(port)]: [port, []], - }); + 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 = info; expect(boardInfo.VID).to.be.equal(vid); @@ -162,9 +202,13 @@ describe('boards-service', () => { it("should show the 'SN' even if no matching board was detected for the port", async () => { const port = selectedPort({ vid, pid, serialNumber }); - const info = await getBoardInfo(port, { - [Port.keyOf(port)]: [port, []], - }); + 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 = info; expect(boardInfo.VID).to.be.equal(vid); @@ -175,9 +219,13 @@ describe('boards-service', () => { it("should use the name of the matching board as 'BN' if available", async () => { const port = selectedPort({ vid, pid }); - const info = await getBoardInfo(port, { - [Port.keyOf(port)]: [port, [selectedBoard]], - }); + const boardList = createBoardList( + { + [Port.keyOf(port)]: { port, boards: [selectedBoard] }, + }, + { selectedPort: port, selectedBoard: undefined } + ); + const info = await getBoardInfo(boardList); expect(typeof info).to.be.equal('object'); const boardInfo = info; expect(boardInfo.VID).to.be.equal(vid); @@ -187,7 +235,3 @@ describe('boards-service', () => { }); }); }); - -function never(): Promise { - return new Deferred().promise; -} 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..1c1892dc2 --- /dev/null +++ b/arduino-ide-extension/src/test/common/common-test-bindings.ts @@ -0,0 +1,97 @@ +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 function bindCommon(bind: interfaces.Bind): interfaces.Bind { + bind(ConsoleLogger).toSelf().inSingletonScope(); + bind(ILogger).toService(ConsoleLogger); + bind(CommandRegistry).toSelf().inSingletonScope(); + bind(CommandService).toService(CommandRegistry); + bindContributionProvider(bind, CommandContribution); + return bind; +} + +@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 { + 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 { + 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 { + 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 { + 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 { + 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 { + 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/node/arduino-daemon-impl.test.ts b/arduino-ide-extension/src/test/node/arduino-daemon-impl.test.ts index af9f66eea..635bbeeb3 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: string; + }> { return super.spawnDaemonProcess(); } @@ -41,19 +43,13 @@ class SilentArduinoDaemonImpl extends ArduinoDaemonImpl { } private async initCliConfig(): Promise { - 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 index fe89cc4b2..fbd5aeb4d 100644 --- 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 @@ -2,21 +2,16 @@ import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { Container } from '@theia/core/shared/inversify'; import { expect } from 'chai'; import { BoardSearch, BoardsService } from '../../common/protocol'; -import { - configureBackendApplicationConfigProvider, - createBaseContainer, - startDaemon, -} from './test-bindings'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; describe('boards-service-impl', () => { let boardService: BoardsService; let toDispose: DisposableCollection; before(async function () { - configureBackendApplicationConfigProvider(); this.timeout(20_000); toDispose = new DisposableCollection(); - const container = createContainer(); + const container = await createContainer(); await start(container, toDispose); boardService = container.get(BoardsService); }); @@ -94,7 +89,7 @@ describe('boards-service-impl', () => { }); }); -function createContainer(): Container { +async function createContainer(): Promise { return createBaseContainer(); } 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..10e5dc543 --- /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/node/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; + +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 { + 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); + }); + + 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/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..1bc09c929 --- /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/node/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 { sync as deleteSync } 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(); + deleteSync(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' + ); + deleteSync(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 + ); + deleteSync(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' + ); + deleteSync(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' + ); + deleteSync(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(); + deleteSync(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 +): Promise { + const coreClientProvider = + container.get(CoreClientProvider); + const coreService = container.get(CoreService); + const libraryService = container.get(LibraryService); + const boardsService = container.get(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((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 = {} +): Promise { + const params = { configDirPath: newTempConfigDirPath(), configOverrides }; + const container = await createContainer(params); + const daemon = container.get(ArduinoDaemonImpl); + const cliPath = daemon.getExecPath(); + const configDirUriProvider = + container.get(ConfigDirUriProvider); + const configDirPath = FileUri.fsPath(configDirUriProvider.configDirUri()); + await coreUpdateIndex(cliPath, configDirPath); + return configDirPath; +} + +async function coreUpdateIndex( + cliPath: string, + configDirPath: string +): Promise { + 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 { + 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 } + | string = newTempConfigDirPath() +): Promise { + 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 index 700673c32..5bf9e5381 100644 --- 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 @@ -9,12 +9,9 @@ import { BoardsService, CoreService, SketchesService, + isCompileSummary, } from '../../common/protocol'; -import { - configureBackendApplicationConfigProvider, - createBaseContainer, - startDaemon, -} from './test-bindings'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; const testTimeout = 30_000; const setupTimeout = 5 * 60 * 1_000; // five minutes @@ -25,21 +22,17 @@ describe('core-service-impl', () => { let container: Container; let toDispose: DisposableCollection; - before(() => { - configureBackendApplicationConfigProvider(); - }); - beforeEach(async function () { this.timeout(setupTimeout); toDispose = new DisposableCollection(); - container = createContainer(); + container = await createContainer(); await start(container, toDispose); }); afterEach(() => toDispose.dispose()); describe('compile', () => { - it('should execute a command with the build path', async function () { + it('should execute a command with the compile summary, including the build path', async function () { this.timeout(testTimeout); const coreService = container.get(CoreService); const sketchesService = container.get(SketchesService); @@ -64,7 +57,7 @@ describe('core-service-impl', () => { const [, args] = executedBuildDidCompleteCommands[0]; expect(args.length).to.be.equal(1); const arg = args[0]; - expect(typeof arg).to.be.equal('object'); + expect(isCompileSummary(arg)).to.be.true; expect('buildOutputUri' in arg).to.be.true; expect(arg.buildOutputUri).to.be.not.undefined; @@ -97,10 +90,12 @@ async function start( }); } -function createContainer(): Container { - return createBaseContainer((bind) => { - bind(TestCommandRegistry).toSelf().inSingletonScope(); - bind(CommandRegistry).toService(TestCommandRegistry); +async function createContainer(): Promise { + return createBaseContainer({ + additionalBindings: (bind, rebind) => { + bind(TestCommandRegistry).toSelf().inSingletonScope(); + rebind(CommandRegistry).toService(TestCommandRegistry); + }, }); } 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((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..26e7c41e5 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(filename)).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 = { + '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 = (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 index 95613395e..6473660da 100644 --- 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 @@ -2,22 +2,16 @@ 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 { LibraryServiceImpl } from '../../node/library-service-impl'; -import { - configureBackendApplicationConfigProvider, - createBaseContainer, - startDaemon, -} from './test-bindings'; +import { createBaseContainer, startDaemon } from './node-test-bindings'; describe('library-service-impl', () => { let libraryService: LibraryService; let toDispose: DisposableCollection; before(async function () { - configureBackendApplicationConfigProvider(); this.timeout(20_000); toDispose = new DisposableCollection(); - const container = createContainer(); + const container = await createContainer(); await start(container, toDispose); libraryService = container.get(LibraryService); }); @@ -72,11 +66,8 @@ describe('library-service-impl', () => { }); }); -function createContainer(): Container { - return createBaseContainer((bind) => { - bind(LibraryServiceImpl).toSelf().inSingletonScope(); - bind(LibraryService).toService(LibraryServiceImpl); - }); +async function createContainer(): Promise { + return createBaseContainer(); } async function start( 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 705652466..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 = { -readonly [P in keyof T]: DeepWriteable }; diff --git a/arduino-ide-extension/src/test/node/test-bindings.ts b/arduino-ide-extension/src/test/node/node-test-bindings.ts similarity index 65% rename from arduino-ide-extension/src/test/node/test-bindings.ts rename to arduino-ide-extension/src/test/node/node-test-bindings.ts index 80a3eea7c..2b4c651f7 100644 --- a/arduino-ide-extension/src/test/node/test-bindings.ts +++ b/arduino-ide-extension/src/test/node/node-test-bindings.ts @@ -1,38 +1,36 @@ -import { - CommandContribution, - CommandRegistry, - CommandService, -} from '@theia/core/lib/common/command'; -import { bindContributionProvider } from '@theia/core/lib/common/contribution-provider'; import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; import { EnvVariablesServer as TheiaEnvVariablesServer } from '@theia/core/lib/common/env-variables'; -import { ILogger, Loggable } from '@theia/core/lib/common/logger'; -import { LogLevel } from '@theia/core/lib/common/logger-protocol'; import { waitForEvent } from '@theia/core/lib/common/promise-util'; -import { MockLogger } from '@theia/core/lib/common/test/mock-logger'; -import { BackendApplicationConfigProvider } from '@theia/core/lib/node/backend-application-config-provider'; +import URI from '@theia/core/lib/common/uri'; +import { FileUri } from '@theia/core/lib/node/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, - AttachedBoardsChangeEvent, - AvailablePorts, BoardsPackage, BoardsService, ConfigService, ConfigState, CoreService, + DetectedPorts, IndexUpdateDidCompleteParams, IndexUpdateDidFailParams, IndexUpdateParams, LibraryPackage, + LibraryService, NotificationServiceClient, NotificationServiceServer, OutputMessage, @@ -44,10 +42,12 @@ import { 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 { @@ -56,85 +56,13 @@ import { } from '../../node/monitor-service-factory'; import { SettingsReader } from '../../node/settings-reader'; import { SketchesServiceImpl } from '../../node/sketches-service-impl'; -import { EnvVariablesServer } from '../../node/theia/env-variables/env-variables-server'; - -@injectable() -class ConsoleLogger extends MockLogger { - override log( - logLevel: number, - arg2: string | Loggable | Error, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ...params: any[] - ): Promise { - 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 { - 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 { - 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 { - 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 { - if (params.length) { - console.error(arg, ...params); - } else { - console.error(arg); - } - } +import { + ConfigDirUriProvider, + EnvVariablesServer, +} from '../../node/theia/env-variables/env-variables-server'; +import { bindCommon } from '../common/common-test-bindings'; - override async fatal( - arg: string | Loggable, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ...params: any[] - ): Promise { - return this.error(arg, params); - } -} +const tracked = track(); @injectable() class SilentArduinoDaemon extends ArduinoDaemonImpl { @@ -145,7 +73,7 @@ class SilentArduinoDaemon extends ArduinoDaemonImpl { @injectable() class TestBoardDiscovery extends BoardDiscovery { - mutableAvailablePorts: AvailablePorts = {}; + mutableDetectedPorts: DetectedPorts = {}; override async start(): Promise { // NOOP @@ -153,8 +81,8 @@ class TestBoardDiscovery extends BoardDiscovery { override async stop(): Promise { // NOOP } - override get availablePorts(): AvailablePorts { - return this.mutableAvailablePorts; + override get detectedPorts(): DetectedPorts { + return this.mutableDetectedPorts; } } @@ -206,7 +134,7 @@ class TestNotificationServiceServer implements NotificationServiceServer { notifyLibraryDidUninstall(event: { item: LibraryPackage }): void { this.events.push(`notifyLibraryDidUninstall:${JSON.stringify(event)}`); } - notifyAttachedBoardsDidChange(event: AttachedBoardsChangeEvent): void { + notifyDetectedPortsDidChange(event: { detectedPorts: DetectedPorts }): void { this.events.push(`notifyAttachedBoardsDidChange:${JSON.stringify(event)}`); } notifyRecentSketchesDidChange(event: { sketches: Sketch[] }): void { @@ -234,14 +162,67 @@ class TestResponseService implements ResponseService { } } -export function createBaseContainer( - containerCustomizations?: ( +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); + readonly configDirPath?: string; + readonly additionalBindings?: ( bind: interfaces.Bind, rebind: interfaces.Rebind - ) => void -): Container { + ) => void; +} + +export async function createBaseContainer( + params?: CreateBaseContainerParams +): Promise { + 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); bind(CoreClientProvider).toSelf().inSingletonScope(); bind(CoreServiceImpl).toSelf().inSingletonScope(); bind(CoreService).toService(CoreServiceImpl); @@ -263,33 +244,64 @@ export function createBaseContainer( return child.get(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(ConsoleLogger).toSelf().inSingletonScope(); - bind(ILogger).toService(ConsoleLogger); bind(TestNotificationServiceServer).toSelf().inSingletonScope(); bind(NotificationServiceServer).toService(TestNotificationServiceServer); bind(ConfigServiceImpl).toSelf().inSingletonScope(); bind(ConfigService).toService(ConfigServiceImpl); - bind(CommandService).toService(CommandRegistry); - bindContributionProvider(bind, CommandContribution); bind(TestBoardDiscovery).toSelf().inSingletonScope(); bind(BoardDiscovery).toService(TestBoardDiscovery); bind(IsTempSketch).toSelf().inSingletonScope(); bind(SketchesServiceImpl).toSelf().inSingletonScope(); bind(SketchesService).toService(SketchesServiceImpl); bind(SettingsReader).toSelf().inSingletonScope(); - if (containerCustomizations) { - containerCustomizations(bind, rebind); - } + 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 { + 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 = {} +): Promise { + const directories = { + data: join(configDirPath, 'data', 'Arduino15'), + downloads: join(configDirPath, 'data', 'Arduino15', 'staging'), + builtin: join(configDirPath, 'data', 'Arduino15', 'libraries'), + 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, { + logging: { level: 'trace' }, + }); + return deepmerge(config, mergedOverrides); +} + export async function startDaemon( container: Container, toDispose: DisposableCollection, @@ -313,18 +325,3 @@ export async function startDaemon( await startCustomizations(container, toDispose); } } - -export function configureBackendApplicationConfigProvider(): void { - try { - BackendApplicationConfigProvider.get(); - } catch (err) { - if ( - err instanceof Error && - err.message.includes('BackendApplicationConfigProvider#set') - ) { - BackendApplicationConfigProvider.set({ - configDirName: '.testArduinoIDE', - }); - } - } -} 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 index 7669971b1..3454fb278 100644 --- 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 @@ -2,31 +2,127 @@ import { Disposable, DisposableCollection, } from '@theia/core/lib/common/disposable'; +import { isWindows } from '@theia/core/lib/common/os'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { Container } from '@theia/core/shared/inversify'; import { expect } from 'chai'; -import { promises as fs } from 'fs'; -import { basename, join } from 'path'; +import { rejects } from 'node:assert/strict'; +import { promises as fs } from 'node:fs'; +import { basename, join } from 'node:path'; import { sync as rimrafSync } from 'rimraf'; +import temp from 'temp'; import { Sketch, SketchesService } from '../../common/protocol'; -import { SketchesServiceImpl } from '../../node/sketches-service-impl'; -import { ErrnoException } from '../../node/utils/errors'; import { - configureBackendApplicationConfigProvider, - createBaseContainer, - startDaemon, -} from './test-bindings'; + isAccessibleSketchPath, + SketchesServiceImpl, +} 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 (non-Windows)', async function () { + if (isWindows) { + // `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. + return this.skip(); + } + 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 + await rejects(fs.readFile(mainSketchFilePath), ErrnoException.isEACCES); + 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 () => { - configureBackendApplicationConfigProvider(); toDispose = new DisposableCollection(); - container = createContainer(); + container = await createContainer(); await start(container, toDispose); }); @@ -231,16 +327,94 @@ describe('sketches-service-impl', () => { expect(mainFileContentOneAfterCopy).to.be.equal(contentOne); expect(mainFileContentTwoAfterCopy).to.be.equal(contentOne); }); + + ( + [ + ['(', ')', 'parentheses'], + ['[', ']', 'brackets'], + ['{', '}', 'braces'], + [ + '<', + '>', + 'chevrons', + { + 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(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( - ...sketch - .map(({ uri }) => FileUri.fsPath(uri)) - .map((path) => - Disposable.create(() => rimrafSync(path, { maxBusyTries: 5 })) - ) + ...paths.map((path) => + Disposable.create(() => rimrafSync(path, { maxBusyTries: 5 })) + ) ); } @@ -257,6 +431,6 @@ async function start( await startDaemon(container, toDispose); } -function createContainer(): Container { +async function createContainer(): Promise { 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 index eb3d24997..1b752e142 100644 --- a/arduino-ide-extension/src/test/node/sketches-service-impl.test.ts +++ b/arduino-ide-extension/src/test/node/sketches-service-impl.test.ts @@ -1,10 +1,10 @@ -import { Mutable } from '@theia/core/lib/common/types'; -import { FileUri } from '@theia/core/lib/node'; -import * as assert from 'assert'; -import { basename, join } from 'path'; +import type { Mutable } from '@theia/core/lib/common/types'; +import { FileUri } from '@theia/core/lib/node/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'; -import stableJsonStringify = require('fast-json-stable-stringify'); const testSketchbook = join( __dirname, @@ -67,7 +67,7 @@ function containersDeepEquals( ) { const stableActual = JSON.parse(stableJsonStringify(actual)); const stableExpected = JSON.parse(stableJsonStringify(expected)); - assert.deepEqual(stableActual, stableExpected); + assert.deepStrictEqual(stableActual, stableExpected); // TODO: get rid of `fast-json-stable-stringify` } /** @@ -86,8 +86,8 @@ function expectedTestSketchbookContainer( rootUri += '/'; } const adjustUri = (sketch: Mutable) => { - assert.equal(sketch.uri.startsWith('template://'), true); - assert.equal(sketch.uri.startsWith('template:///'), false); + assert.strictEqual(sketch.uri.startsWith('template://'), true); + assert.strictEqual(sketch.uri.startsWith('template:///'), false); sketch.uri = sketch.uri.replace('template://', rootUri).toString(); return sketch; }; diff --git a/arduino-ide-extension/tsconfig.json b/arduino-ide-extension/tsconfig.json index 90b219921..222831ace 100644 --- a/arduino-ide-extension/tsconfig.json +++ b/arduino-ide-extension/tsconfig.json @@ -9,8 +9,8 @@ "experimentalDecorators": true, "downlevelIteration": true, "emitDecoratorMetadata": true, - "module": "commonjs", - "moduleResolution": "node", + "module": "Node16", + "moduleResolution": "node16", "resolveJsonModule": true, "target": "ES2017", "outDir": "lib", 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:
+ 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\\.arduinoIDE\ + ``` + (where `` 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 **Command**+**Shift**+**.** 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.
+ 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).
+ ⚠ Please be careful when deleting things from your computer. When in doubt, back up! diff --git a/docs/development.md b/docs/development.md index 06ade68ce..c7620400a 100644 --- a/docs/development.md +++ b/docs/development.md @@ -5,14 +5,16 @@ This page includes technical documentation for developers who want to build the ## Architecture overview The IDE consists of three major parts: - - the _Electron main_ process, - - the _backend_, and - - the _frontend_. + +- 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. + +- 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. @@ -21,13 +23,14 @@ By default, whenever the _Electron main_ process creates a web page, it will ins 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]]. + +- 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`. @@ -43,6 +46,11 @@ This repository contains the main code, but two more repositories are included d - [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. + ## Build from source --- @@ -54,63 +62,143 @@ This repository contains the main code, but two more repositories are included d 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 16 must be used instead of the version 14 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 - ``` +### 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 + + - Ctrl/⌘+Shift+P to open the _Command Palette_. + - Type `Tasks: Run Task` and press Enter. + - Type `Rebuild App` and press Enter. + - 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 + + - Ctrl/⌘+Shift+P. + - Type `Tasks: Run Task` and press Enter. + - Type `Watch All` and press Enter. + - Select how you want to scan the task output. You can press Enter or Esc. [Click](https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher) here to learn more. -2. Rebuild the dependencies - ```sh - yarn rebuild:browser - ``` +7. Start the application in debug mode + - Open the _Run and Debug_ view with Ctrl/⌘+Shift+D, + - Select `App` from the dropdown, + - Start debugging with F5. -3. Rebuild the electron dependencies - ```sh - yarn rebuild:electron - ``` +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_. -4. Start the application - ```sh - yarn start - ``` +### 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. -### CI +## Running Checks -This project is built on [GitHub Actions](https://github.com/arduino/arduino-ide/actions). +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. - - _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: +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 - git push origin 1.2.3 + 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 F5. + +### 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?* +- _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. + 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?* +- _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`. + [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/release-procedure.md b/docs/internal/release-procedure.md index fa043bf28..0f62d8ffa 100644 --- a/docs/internal/release-procedure.md +++ b/docs/internal/release-procedure.md @@ -1,5 +1,7 @@ # Release Procedure +The ["trunk-based" development strategy](https://trunkbaseddevelopment.com/) is used for releases of Arduino IDE. A branch named `..x` (where `.` 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: @@ -39,28 +41,60 @@ 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. 🚢 Create the release on GitHub +### 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:
+ https://github.com/arduino/arduino-ide/actions +1. Type `branch:` (where `` is the name of the release branch for this release) in the "**Filter workflow runs**" field of the "**Actions**" page. +1. Press the **Enter** 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. + +#### 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 -m "" -git push origin -``` +1. Checkout the release branch in the repository. +1. Run the following commands: + ```text + git pull + git tag -a -m "" + git push origin + ``` 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. -### 5. ⬆️ Bump version metadata of packages +### 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). -### 6. 📄 Create the changelog +### 8. 📄 Create the changelog **Create GitHub issues for the known issues** that we haven't solved in the current release: @@ -79,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. -### 7. ✎ 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. @@ -96,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 -### 8. 😎 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).
diff --git a/electron-app/arduino-ide-backend-main.js b/electron-app/arduino-ide-backend-main.js new file mode 100644 index 000000000..263b62798 --- /dev/null +++ b/electron-app/arduino-ide-backend-main.js @@ -0,0 +1,42 @@ +// @ts-check +'use strict'; + +// 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; + } + const { setup, log } = require('node-log-rotate'); + + setup({ + appName: 'Arduino IDE', + maxSize: 10 * 1024 * 1024, + }); + for (const name of ['log', 'trace', 'debug', 'info', 'warn', 'error']) { + 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); + log(message); + }; + } +} + +if (process.env.IDE2_FILE_LOGGER === 'true') { + enableFileLogger(); +} + +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..8375b5891 --- /dev/null +++ b/electron-app/arduino-ide-electron-main.js @@ -0,0 +1,25 @@ +// @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(','); + // Enables the file logger in the backend process. + process.env.IDE2_FILE_LOGGER = 'true'; +} + +require('./lib/backend/electron-main'); diff --git a/electron-app/package.json b/electron-app/package.json index d7d71539a..25bfbdd26 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,36 +1,59 @@ { "private": true, "name": "electron-app", - "version": "2.1.0", + "version": "2.2.0", "license": "AGPL-3.0-or-later", - "main": "src-gen/frontend/electron-main.js", + "main": "./src-gen/backend/electron-main.js", "dependencies": { - "@theia/core": "1.31.1", - "@theia/debug": "1.31.1", - "@theia/editor": "1.31.1", - "@theia/electron": "1.31.1", - "@theia/file-search": "1.31.1", - "@theia/filesystem": "1.31.1", - "@theia/keymaps": "1.31.1", - "@theia/messages": "1.31.1", - "@theia/monaco": "1.31.1", - "@theia/navigator": "1.31.1", - "@theia/plugin-ext": "1.31.1", - "@theia/plugin-ext-vscode": "1.31.1", - "@theia/preferences": "1.31.1", - "@theia/process": "1.31.1", - "@theia/terminal": "1.31.1", - "@theia/workspace": "1.31.1", - "arduino-ide-extension": "2.1.0" + "@theia/core": "1.39.0", + "@theia/debug": "1.39.0", + "@theia/editor": "1.39.0", + "@theia/electron": "1.39.0", + "@theia/filesystem": "1.39.0", + "@theia/keymaps": "1.39.0", + "@theia/messages": "1.39.0", + "@theia/monaco": "1.39.0", + "@theia/navigator": "1.39.0", + "@theia/plugin-ext": "1.39.0", + "@theia/plugin-ext-vscode": "1.39.0", + "@theia/preferences": "1.39.0", + "@theia/terminal": "1.39.0", + "@theia/workspace": "1.39.0", + "arduino-ide-extension": "2.2.0" }, "devDependencies": { - "@theia/cli": "1.31.1", - "electron": "^15.3.5" + "@theia/cli": "1.39.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": "^23.2.4", + "electron-builder": "23.6.0", + "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": "^2.6.1", + "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 && theia rebuild:electron" }, "theia": { "target": "electron", @@ -41,6 +64,7 @@ "light": "arduino-theme", "dark": "arduino-theme-dark" }, + "defaultIconTheme": "none", "validatePreferencesSchema": false, "preferences": { "window.title": "${rootName}${activeEditorShort}${appName}", @@ -63,7 +87,8 @@ }, "backend": { "config": { - "configDirName": ".arduinoIDE" + "configDirName": ".arduinoIDE", + "singleInstance": true } }, "generator": { @@ -71,5 +96,132 @@ "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" + ] + }, + "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.52.1/file/vscode.cpp-1.52.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.0.2-beta.8.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://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.78.0/file/MS-CEINTL.vscode-language-pack-cs-1.78.0.vsix", + "vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.78.0/file/MS-CEINTL.vscode-language-pack-de-1.78.0.vsix", + "vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.78.0/file/MS-CEINTL.vscode-language-pack-es-1.78.0.vsix", + "vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.78.0/file/MS-CEINTL.vscode-language-pack-fr-1.78.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.78.0/file/MS-CEINTL.vscode-language-pack-it-1.78.0.vsix", + "vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.78.0/file/MS-CEINTL.vscode-language-pack-ja-1.78.0.vsix", + "vscode-language-pack-ko": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ko/1.78.0/file/MS-CEINTL.vscode-language-pack-ko-1.78.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.78.0/file/MS-CEINTL.vscode-language-pack-pl-1.78.0.vsix", + "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.78.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.78.0.vsix", + "vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.78.0/file/MS-CEINTL.vscode-language-pack-ru-1.78.0.vsix", + "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.78.0/file/MS-CEINTL.vscode-language-pack-tr-1.78.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.78.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.78.0.vsix", + "vscode-language-pack-zh-hant": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hant/1.78.0/file/MS-CEINTL.vscode-language-pack-zh-hant-1.78.0.vsix" + }, + "mocha": { + "reporter": "spec", + "colors": true, + "watch-extensions": "js", + "timeout": 10000 } } 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/packager/utils.js b/electron-app/scripts/archive.js similarity index 55% rename from electron/packager/utils.js rename to electron-app/scripts/archive.js index 9efb418b9..19eeb8165 100644 --- a/electron/packager/utils.js +++ b/electron-app/scripts/archive.js @@ -1,30 +1,33 @@ -//@ts-check +// @ts-check +'use strict'; -const fs = require('fs'); +const fs = require('node:fs'); +const path = require('node:path'); const zip = require('7zip-min'); const temp = require('temp'); -const path = require('path'); -const shell = require('shelljs'); -const fromFile = require('file-type').fromFile; /** * `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. + * 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, targetFolderName, noCleanup) { +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(targetFolderName)) { - reject(new Error(`${targetFolderName} does not exist.`)); + if (!fs.existsSync(targetFolder)) { + reject(new Error(`${targetFolder} does not exist.`)); return; } - if (!fs.lstatSync(targetFolderName).isDirectory()) { - reject(new Error(`${targetFolderName} is not a directory.`)); + if (!fs.lstatSync(targetFolder).isDirectory()) { + reject(new Error(`${targetFolder} is not a directory.`)); return; } console.log(`⏱️ >>> Adjusting ZIP structure ${pathToZip}...`); @@ -52,12 +55,12 @@ function adjustArchiveStructure(pathToZip, targetFolderName, noCleanup) { const unzipOut = path.join(track.mkdirSync(), root); fs.mkdirSync(unzipOut); await unpack(pathToZip, unzipOut); - const adjustedZip = path.join(targetFolderName, path.basename(pathToZip)); + 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 ${targetFolderName} folder.` + )} to the ${targetFolder} folder.` ); resolve(adjustedZip); } finally { @@ -77,6 +80,10 @@ function basename(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) => { @@ -113,68 +120,16 @@ function list(what) { }); } +/** + * @param {string} pathToFile + */ async function isZip(pathToFile) { if (!fs.existsSync(pathToFile)) { throw new Error(`${pathToFile} does not exist`); } - const type = await fromFile(pathToFile); + const fileType = await import('file-type'); + const type = await fileType.fileTypeFromFile(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 = { - adjustArchiveStructure, - isZip, - unpack, - isNightly, - isRelease, - isElectronPublish, - git, - getChannelFile, -}; +module.exports = { isZip, unpack, adjustArchiveStructure }; diff --git a/electron/build/scripts/notarize.js b/electron-app/scripts/notarize.js similarity index 55% rename from electron/build/scripts/notarize.js rename to electron-app/scripts/notarize.js index ec29ec09c..0a74e2084 100644 --- a/electron/build/scripts/notarize.js +++ b/electron-app/scripts/notarize.js @@ -1,30 +1,34 @@ +// @ts-check +'use strict'; + const isCI = require('is-ci'); const { notarize } = require('electron-notarize'); exports.default = async function notarizing(context) { if (!isCI) { - if ( - typeof process.env.MACOS_FORCE_NOTARIZE === 'string' && - /true/i.test(process.env.MACOS_FORCE_NOTARIZE) - ) { - // Hack for manual M1 signing. Set the MACOS_FORCE_NOTARIZE env variable to true, to force notarization when not on a CI. The 'true' is case insensitive. - console.log( - `Detected the 'MACOS_FORCE_NOTARIZE' environment variable with '${process.env.MACOS_FORCE_NOTARIZE}' value. Forcing the app notarization, although not on a CI.` - ); - } else { - 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..87a597094 --- /dev/null +++ b/electron-app/scripts/package.js @@ -0,0 +1,166 @@ +// @ts-check +'use strict'; + +const semver = require('semver'); +const { isNightly, isRelease } = require('./utils'); + +async function run() { + /** @type {string} */ + const electronVersion = + require('../package.json').devDependencies['electron']; + 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.slice(1), // removes the leading ^ from the version. TODO: user `semver` to clean it. + '-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} + */ +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} + */ +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 | undefined} [options] + * @returns {Promise} + */ +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..23e837e4d --- /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/packager/test/utils.test.js b/electron-app/test/archive.test.js similarity index 62% rename from electron/packager/test/utils.test.js rename to electron-app/test/archive.test.js index e8f7af805..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'); - -describe('utils', () => { +// @ts-check +'use strict'; + +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 consoleStub; + let tracked; + let originalLog; + before(() => { + tracked = temp.track(); + originalLog = console.log; + console.log = () => { + /*NOOP*/ + }; + }); - beforeEach(() => { - consoleStub = sinon.stub(console, 'log').value(() => { - /* NOOP */ - }); + 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); @@ -36,10 +44,10 @@ describe('utils', () => { try { const zip = path.join( __dirname, - 'resources', + 'test-resources', 'zip-with-base-folder.zip' ); - await testMe.adjustArchiveStructure( + await adjustArchiveStructure( zip, path.join(__dirname, 'some', 'missing', 'path') ); @@ -54,10 +62,10 @@ describe('utils', () => { try { const zip = path.join( __dirname, - 'resources', + 'test-resources', 'zip-with-base-folder.zip' ); - await testMe.adjustArchiveStructure(zip, path.join(__filename)); + await adjustArchiveStructure(zip, path.join(__filename)); throw new Error('Expected a rejection'); } catch (e) { expect(e).to.be.an.instanceOf(Error); @@ -66,23 +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'); @@ -97,14 +110,18 @@ 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 @@ -116,14 +133,18 @@ describe('utils', () => { }); 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'); 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..d76d61f06 --- /dev/null +++ b/electron-app/webpack.base.js @@ -0,0 +1,138 @@ +// @ts-check +'use strict'; + +const chmodr = require('chmodr'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const path = require('node:path'); +const fs = require('node:fs/promises'); + +const isWindows = process.platform === 'win32'; +const isMacOS = process.platform === 'darwin'; + +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 { + constructor(targetPath, patchTheia12780 = false) { + this.targetPath = targetPath; + this.patchTheia12780 = patchTheia12780; + } + + /** + * @param {import('webpack').Compiler} compiler + */ + apply(compiler) { + compiler.hooks.afterEmit.tap('PermissionsPlugin', () => { + return new Promise(async (resolve, reject) => { + if (this.patchTheia12780) { + let trashBinaryFilename = undefined; + if (isWindows) { + trashBinaryFilename = 'windows-trash.exe'; + } else if (isMacOS) { + trashBinaryFilename = 'macos-trash'; + } + if (trashBinaryFilename) { + await fs.chmod( + path.join(__dirname, 'lib', 'backend', trashBinaryFilename), + 0o755 + ); + } + } + 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 {boolean|undefined} [patchTheia12780=true] to apply patch for https://github.com/eclipse-theia/theia/issues/12780. Only required in the production app. + * @param {string|undefined} [baseDir=__dirname] to calculate the modules from. Defaults to `__dirname` + */ +function createCopyArduinoResourcesPlugins( + targetPath, + patchTheia12780 = false, + baseDir = __dirname +) { + const trashBinariesPath = path.join( + resolvePackagePath('trash', baseDir), + 'lib' + ); + 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'), + }, + ], + }; + + if (patchTheia12780) { + // workaround for https://github.com/eclipse-theia/theia/issues/12780 + // copy the Windows (`windows-trash.exe`) and macOS (`macos-trash`) executables for `trash` + if (isWindows) { + copyOptions.patterns.push({ + from: path.join(trashBinariesPath, 'windows-trash.exe'), + to: path.resolve(__dirname, 'lib', 'backend'), + }); + } else if (isMacOS) { + copyOptions.patterns.push({ + from: path.join(trashBinariesPath, 'macos-trash'), + to: path.resolve(__dirname, 'lib', 'backend'), + }); + } + } + return [ + new CopyWebpackPlugin(copyOptions), + new PermissionsPlugin(targetPath, patchTheia12780), + ]; +} + +/** + * 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 new file mode 100644 index 000000000..0db6b8024 --- /dev/null +++ b/electron-app/webpack.config.js @@ -0,0 +1,62 @@ +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'); + +// 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]; + +// Taken from https://github.com/eclipse-theia/theia-blueprint/blob/022878d5488c47650fb17b5fdf49a28be88465fe/applications/electron/webpack.config.js#L18-L21 +if (process.platform !== 'win32') { + // For some reason, blueprint wants to bundle the `.node` files directly without going through `@vscode/windows-ca-certs` + backend.ignoredResources.add( + '@vscode/windows-ca-certs/build/Release/crypt32.node' + ); +} + +// 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'), + true + ) +); + +// Override the default entry from Theia as IDE2 has a customization of the module. +backend.config.entry['nsfw-watcher'] = { + import: require.resolve( + 'arduino-ide-extension/lib/node/theia/filesystem/nsfw-watcher' + ), + library: { + type: 'commonjs2', + }, +}; + +// 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'); + +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 760c5a666..000000000 --- a/electron/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -# 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` and lock file under the `build` folder. -build/package.json -build/yarn.lock - -# Resources the packager copies from dev to prod -build/resources/preload.html - -# For the private npm package registry -packager/npm-registry/storage 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 12ad02e72..000000000 --- a/electron/build/scripts/arduino-ide-electron-main.js +++ /dev/null @@ -1,15 +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(), '.arduinoIDE', '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 a835ee23e..000000000 --- a/electron/build/template-package.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "main": "scripts/arduino-ide-electron-main.js", - "author": "Arduino SA", - "resolutions": { - "**/fs-extra": "^4.0.3", - "electron-builder": "23.6.0" - }, - "dependencies": { - "node-log-rotate": "^0.1.5" - }, - "devDependencies": { - "@theia/cli": "1.31.1", - "cross-env": "^7.0.2", - "electron-builder": "23.6.0", - "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", - "download:plugins": "theia download:plugins", - "patch": "ncp ./patch/backend/main.js ./src-gen/backend/main.js" - }, - "engines": { - "node": ">=16.0.0 <17" - }, - "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", - "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" - } - ] - } -} diff --git a/electron/packager/config.js b/electron/packager/config.js deleted file mode 100644 index caa1cd6b2..000000000 --- a/electron/packager/config.js +++ /dev/null @@ -1,155 +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': { - if (arch === 'arm64') { - return `${name}_${id}_macOS_arm64.\$\{ext}`; - } - 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 65c82d8df..000000000 --- a/electron/packager/index.js +++ /dev/null @@ -1,536 +0,0 @@ -//@ts-check -(async () => { - const toDispose = []; - const disposeAll = () => { - let disposable = toDispose.pop(); - while (disposable) { - try { - disposable(); - } catch (err) { - console.error(err); - } - disposable = toDispose.pop(); - } - }; - process.on('uncaughtException', (error) => { - disposeAll(); - throw error; - }); - process.on('unhandledRejection', (reason) => { - disposeAll(); - throw reason; - }); - - const fs = require('fs'); - const join = require('path').join; - const shell = require('shelljs'); - const { echo, cp, mkdir, mv, rm } = shell; - shell.config.fatal = true; - const glob = require('glob'); - const isCI = require('is-ci'); - // 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 repoRoot = join(__dirname, '..', '..'); - /** - * Extensions are expected to be folders directly available from the repository root. - */ - const extensions = require('./extensions.json'); - echo( - `Building the application with the following extensions:\n${extensions - .map((ext) => ` - ${ext}`) - .join(',\n')}` - ); - - try { - //---------------------------+ - // Clean the previous state. | - //---------------------------+ - // Clean up the `./electron/build` folder. - const resourcesToKeep = [ - 'patch', - 'resources', - 'scripts', - 'template-package.json', - ]; - fs.readdirSync(join(repoRoot, 'electron', 'build')) - .filter((filename) => resourcesToKeep.indexOf(filename) === -1) - .forEach((filename) => - rm('-rf', join(repoRoot, 'electron', 'build', filename)) - ); - - // Clean up the `./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 = ['resources']; - foldersToSyncFromDev.forEach((filename) => - shell.exec( - `git -C ${join(repoRoot, 'electron', 'build', filename)} clean -ffxdq`, - { - async: false, - } - ) - ); - - //----------------------------------------------------+ - // Copy the Theia preload, etc. from `./electron-app` | - //----------------------------------------------------+ - for (const filename of foldersToSyncFromDev) { - cp( - '-rf', - join(repoRoot, 'electron-app', filename), - join(repoRoot, 'electron', 'build') - ); - } - - //----------------------------------------------+ - // Sanity check: all versions must be the same. | - //----------------------------------------------+ - verifyVersions(extensions); - - //-------------------------------+ - // Build and test the extensions | - //-------------------------------+ - for (const extension of extensions) { - exec( - `yarn --network-timeout 1000000 --cwd ${join(repoRoot, extension)}`, - `Building and testing ${extension}` - ); - exec( - `yarn --network-timeout 1000000 --cwd ${join( - repoRoot, - extension - )} test:slow`, - `Executing slow tests ${extension}` - ); - } - - //------------------------+ - // Publish the extensions | - //------------------------+ - const npmrc = join(repoRoot, '.npmrc'); - const storage = join(__dirname, 'npm-registry', 'storage'); - rm('-rf', npmrc); - rm('-rf', storage); - // To avoid interactive npm login on the CI when publishing to the private registry. - // The actual token is fake and does not matter as the publishing is `$anonymous` anyway. - fs.writeFileSync(npmrc, '//localhost:4873/:_authToken=placeholder\n', { - encoding: 'utf8', - }); - toDispose.push(() => rm('-rf', storage)); - toDispose.push(() => rm('-rf', npmrc)); - const npmProxyProcess = await startNpmRegistry( - join(__dirname, 'npm-registry', 'config.yml') - ); - toDispose.push(() => { - if (!npmProxyProcess.killed) { - npmProxyProcess.kill(); - } - }); - for (const extension of extensions) { - const packageJsonPath = join(repoRoot, extension, 'package.json'); - const versionToRestore = readJson(packageJsonPath).version; - exec( - `yarn --network-timeout 1000000 --cwd ${join( - repoRoot, - extension - )} publish --ignore-scripts --new-version ${version} --no-git-tag-version --registry http://localhost:4873`, - `Publishing ${extension}@${version} to the private npm registry` - ); - // Publishing will change the version number, this should be reverted up after the build. - // A git checkout or reset could be easier, but this is safer to avoid wiping uncommitted dev state. - toDispose.push(() => { - const json = readJson(packageJsonPath); - json.version = versionToRestore; - writeJson(packageJsonPath, json); - }); - } - - //-----------------------------------------------------------------------------------------------------------+ - // Merge the `./package.json` and `./electron-app/package.json` with `electron/build/template-package.json`. | - //-----------------------------------------------------------------------------------------------------------+ - const rootPackageJson = readJson(join(repoRoot, 'package.json')); - const appPackageJson = readJson( - join(repoRoot, 'electron-app', 'package.json') - ); - const dependencies = {}; - for (const extension of extensions) { - dependencies[extension] = version; - } - appPackageJson.dependencies = { - ...appPackageJson.dependencies, - ...dependencies, - }; - appPackageJson.devDependencies = { - ...appPackageJson.devDependencies, - ...template.devDependencies, - }; - // Deep-merging the Theia application configuration. - const theia = merge(appPackageJson.theia || {}, template.theia || {}); - const content = { - ...appPackageJson, - ...template, - theia, - dependencies: appPackageJson.dependencies, - devDependencies: appPackageJson.devDependencies, - // VS Code extensions and the plugins folder is defined in the root `package.json`. The template picks them up. - theiaPluginsDir: rootPackageJson.theiaPluginsDir, - theiaPlugins: rootPackageJson.theiaPlugins, - }; - writeJson( - join(repoRoot, 'electron', 'build', 'package.json'), - merge(content, template, { - arrayMerge: (_, sourceArray) => sourceArray, - }) - ); - - echo(`📜 Effective 'package.json' for the ${productName} application: ------------------------ -${fs - .readFileSync(join(repoRoot, 'electron', 'build', 'package.json')) - .toString()} ------------------------ - `); - - // Make sure the original `yarn.lock` file is used from the electron application. - if (fs.existsSync(join(repoRoot, 'electron', 'build', 'yarn.lock'))) { - echo( - `${join(repoRoot, 'electron', 'build', 'yarn.lock')} must not exist.` - ); - shell.exit(1); - } - cp('-rf', join(repoRoot, 'yarn.lock'), join(repoRoot, 'electron', 'build')); - if (!fs.existsSync(join(repoRoot, 'electron', 'build', 'yarn.lock'))) { - echo( - `${join(repoRoot, 'electron', 'build', 'yarn.lock')} does not exist.` - ); - shell.exit(1); - } - - // 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(join(repoRoot, 'node_modules'))) { - // We either do this or change the project structure. - echo( - "🔧 >>> [Hack] Renaming the root 'node_modules' folder to '.node_modules'..." - ); - mv('-f', join(repoRoot, 'node_modules'), join(repoRoot, '.node_modules')); - echo( - "👌 <<< [Hack] Renamed the root 'node_modules' folder to '.node_modules'." - ); - } - toDispose.push(() => { - if (fs.existsSync(join(repoRoot, '.node_modules'))) { - echo( - "🔧 >>> [Restore] Renaming the root '.node_modules' folder to 'node_modules'..." - ); - mv( - '-f', - join(repoRoot, '.node_modules'), - join(repoRoot, 'node_modules') - ); - echo( - "👌 >>> [Restore] Renamed the root '.node_modules' folder to 'node_modules'." - ); - } - }); - - //-------------------------------------------------------------------------------------------+ - // Install all private and public dependencies for the electron application and build Theia. | - //-------------------------------------------------------------------------------------------+ - exec( - `yarn --network-timeout 1000000 --cwd ${join( - repoRoot, - 'electron', - 'build' - )} --registry http://localhost:4873`, - 'Installing dependencies' - ); - exec( - `yarn --cwd ${join(repoRoot, 'electron', 'build')} build`, - `Building the ${productName} application` - ); - exec( - `yarn --cwd ${join(repoRoot, 'electron', 'build')} rebuild`, - 'Rebuilding 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(join(repoRoot, 'electron', 'build', dotenv))) { - rm('-rf', join(repoRoot, 'electron', '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( - join(repoRoot, 'electron', 'build', dotenv), - `ARDUINO_VERSION=${version}` - ); - - //-----------------------------------+ - // Package the electron application. | - //-----------------------------------+ - exec( - `yarn --cwd ${join(repoRoot, 'electron', 'build')} package`, - `Packaging the ${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. The application is at: ${join( - repoRoot, - 'electron', - 'build', - 'dist' - )}` - ); - } finally { - disposeAll(); - } - - //--------+ - // Utils. | - //--------+ - function exec(command, toEcho) { - if (toEcho) { - echo(`⏱️ >>> ${toEcho}...`); - } - const { stdout } = shell.exec(command); - if (toEcho) { - echo(`👌 <<< ${toEcho}.`); - } - return stdout; - } - - async function copyFilesToBuildArtifacts() { - echo(`🚢 Detected CI, moving build artifacts...`); - const { platform } = process; - const cwd = join(repoRoot, 'electron', 'build', 'dist'); - const targetFolder = join( - repoRoot, - 'electron', - '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 = join(repoRoot, 'electron', '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] - */ - function hashFile(file, algorithm = 'sha512', encoding = 'base64', options) { - const crypto = require('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, - }); - }); - } - - /** - * @param {string[]} allDependencies - * @param {string} [expectedVersion] - */ - function verifyVersions(allDependencies, expectedVersion) { - const versions = new Set(); - for (const dependency of allDependencies) { - versions.add( - readJson(join(repoRoot, 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); - } - } - } - - /** - * @param {string} configPath - * @return {Promise} - */ - function startNpmRegistry(configPath) { - return new Promise((resolve, reject) => { - const fork = require('child_process').fork( - require.resolve('verdaccio/bin/verdaccio'), - ['-c', configPath] - ); - fork.on('message', (msg) => { - if (typeof msg === 'object' && 'verdaccio_started' in msg) { - resolve(fork); - } - }); - fork.on('error', reject); - fork.on('disconnect', reject); - }); - } - - /** - * @param {string} path - * @param {object} jsonObject - */ - function writeJson(path, jsonObject) { - fs.writeFileSync(path, JSON.stringify(jsonObject, null, 2) + '\n'); - } - - /** - * @param {string} path - * @return {object} - */ - function readJson(path) { - const raw = fs.readFileSync(path, { encoding: 'utf8' }); - return JSON.parse(raw); - } -})(); diff --git a/electron/packager/npm-registry/config.yml b/electron/packager/npm-registry/config.yml deleted file mode 100644 index b3a1413a7..000000000 --- a/electron/packager/npm-registry/config.yml +++ /dev/null @@ -1,19 +0,0 @@ -storage: ./storage -uplinks: - npmjs: - url: 'https://registry.npmjs.org/' -packages: - '**': - access: $all - publish: $anonymous - unpublish: $anonymous - proxy: npmjs -server: - keepAliveTimeout: 60 -listen: - - 'localhost:4873' -max_body_size: 100mb -log: - type: stdout - format: pretty - level: warn diff --git a/electron/packager/package.json b/electron/packager/package.json deleted file mode 100644 index ac35bf151..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": { - "@types/file-type": "^10.9.1", - "@types/temp": "^0.8.32", - "7zip-min": "^1.1.1", - "chai": "^4.2.0", - "crypto": "^1.0.1", - "dateformat": "^3.0.3", - "deepmerge": "2.01", - "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", - "verdaccio": "6-next", - "yaml": "^1.10.2", - "yargs": "^12.0.5" - }, - "engines": { - "node": ">=16.0.0 <17" - }, - "mocha": { - "reporter": "spec", - "colors": true, - "watch-extensions": "js", - "timeout": 10000 - } -} diff --git a/electron/packager/yarn.lock b/electron/packager/yarn.lock deleted file mode 100644 index 88a76837a..000000000 --- a/electron/packager/yarn.lock +++ /dev/null @@ -1,3151 +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/runtime@^7.15.4": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" - integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== - dependencies: - regenerator-runtime "^0.13.11" - -"@fastify/ajv-compiler@^3.3.1": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@fastify/ajv-compiler/-/ajv-compiler-3.4.0.tgz#e001b7e234b5b704654b1d617d69fa63c348f2a7" - integrity sha512-69JnK7Cot+ktn7LD5TikP3b7psBPX55tYpQa8WSumt8r117PCa2zwHnImfBtRWYExreJlI48hr0WZaVrTBGj7w== - dependencies: - ajv "^8.11.0" - ajv-formats "^2.1.1" - fast-uri "^2.0.0" - -"@fastify/deepmerge@^1.0.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@fastify/deepmerge/-/deepmerge-1.3.0.tgz#8116858108f0c7d9fd460d05a7d637a13fe3239a" - integrity sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A== - -"@fastify/error@^3.0.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@fastify/error/-/error-3.2.0.tgz#9010e0acfe07965f5fc7d2b367f58f042d0f4106" - integrity sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ== - -"@fastify/fast-json-stringify-compiler@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.1.0.tgz#ebf657ce4ec88e27ba311f7560eaa0b37de8719d" - integrity sha512-cTKBV2J9+u6VaKDhX7HepSfPSzw+F+TSd+k0wzifj4rG+4E5PjSFJCk19P8R6tr/72cuzgGd+mbB3jFT6lvAgw== - dependencies: - fast-json-stringify "^5.0.0" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - 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== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@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", "@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== - -"@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" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@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/cacheable-request@^6.0.1": - 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" "^3.1.4" - "@types/node" "*" - "@types/responselike" "^1.0.0" - -"@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/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/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== - dependencies: - "@types/node" "*" - -"@types/lodash@^4.14.175": - version "4.14.191" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" - integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== - -"@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/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/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" "*" - -"@verdaccio/api@6.0.0-6-next.35": - version "6.0.0-6-next.35" - resolved "https://registry.yarnpkg.com/@verdaccio/api/-/api-6.0.0-6-next.35.tgz#b05b84a3051c06b1400c3ad6bf3ce77651af4231" - integrity sha512-sIeKJyVwACl2DMmo1r5eduNq6podTjrL48jvIkHqvDxjBer+cmlwzt1k6khM5n/USh2Cbp4dxsViQP6T/1EVNA== - dependencies: - "@verdaccio/auth" "6.0.0-6-next.31" - "@verdaccio/config" "6.0.0-6-next.52" - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/logger" "6.0.0-6-next.20" - "@verdaccio/middleware" "6.0.0-6-next.31" - "@verdaccio/store" "6.0.0-6-next.32" - "@verdaccio/utils" "6.0.0-6-next.20" - abortcontroller-polyfill "1.7.5" - body-parser "1.20.1" - cookies "0.8.0" - debug "4.3.4" - express "4.18.2" - lodash "4.17.21" - mime "2.6.0" - semver "7.3.8" - -"@verdaccio/auth@6.0.0-6-next.31": - version "6.0.0-6-next.31" - resolved "https://registry.yarnpkg.com/@verdaccio/auth/-/auth-6.0.0-6-next.31.tgz#47f19aa614c90a6e1017c718f9c0b393a0f21f30" - integrity sha512-GPJn8q+BPpu0JyPjGi+vHASN5lD47IV20ciIKrMJL3hlbFBqTVP/9sWHe+j5XyYVirdKKH+q9D0q1ZPLzbkQZw== - dependencies: - "@verdaccio/config" "6.0.0-6-next.52" - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/loaders" "6.0.0-6-next.21" - "@verdaccio/logger" "6.0.0-6-next.20" - "@verdaccio/utils" "6.0.0-6-next.20" - debug "4.3.4" - express "4.18.2" - jsonwebtoken "8.5.1" - lodash "4.17.21" - verdaccio-htpasswd "11.0.0-6-next.22" - -"@verdaccio/cli@6.0.0-6-next.52": - version "6.0.0-6-next.52" - resolved "https://registry.yarnpkg.com/@verdaccio/cli/-/cli-6.0.0-6-next.52.tgz#91192b9ae50ae0721f52aee9c1fa988623a8c43b" - integrity sha512-aCl4/ypjWGj3bnjxF1v/hlTExPBknzAylcXFUT1SNIU+GfXcLnjX3swfXQiGTcGTafydGim2i0htb4AHF7d8AQ== - dependencies: - "@verdaccio/config" "6.0.0-6-next.52" - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/logger" "6.0.0-6-next.20" - "@verdaccio/node-api" "6.0.0-6-next.52" - clipanion "3.1.0" - envinfo "7.8.1" - kleur "3.0.3" - semver "7.3.8" - -"@verdaccio/config@6.0.0-6-next.52": - version "6.0.0-6-next.52" - resolved "https://registry.yarnpkg.com/@verdaccio/config/-/config-6.0.0-6-next.52.tgz#dab301f3880d4b0a44e4ede950a32906588c4b5c" - integrity sha512-a8oqupyMEMZCKuv/qpuvVTOgIbx/kgGQPiDYgyKtRJRV5tiwn+IqJIXwkGazYFP/AbmgM7BIGvptGkTRb2QwOQ== - dependencies: - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/utils" "6.0.0-6-next.20" - debug "4.3.4" - lodash "4.17.21" - minimatch "3.1.2" - yaml "2.1.3" - yup "0.32.11" - -"@verdaccio/core@6.0.0-6-next.52": - version "6.0.0-6-next.52" - resolved "https://registry.yarnpkg.com/@verdaccio/core/-/core-6.0.0-6-next.52.tgz#0b9cf1e98668cb084f58c75a9920b5c2f2f8d504" - integrity sha512-5aVVU/kWze3Xo2iycLUG5iqafuLCPGQuNnDYtzb36rR/mWrT1L+z7JC+48uY8ATTOsk8GGMXi665t8Htrdw0JA== - dependencies: - ajv "8.11.2" - core-js "3.26.1" - http-errors "1.8.1" - http-status-codes "2.2.0" - process-warning "1.0.0" - semver "7.3.8" - -"@verdaccio/file-locking@11.0.0-6-next.6": - version "11.0.0-6-next.6" - resolved "https://registry.yarnpkg.com/@verdaccio/file-locking/-/file-locking-11.0.0-6-next.6.tgz#a9d2025183d9ebf0805461df217b9f0c3313953f" - integrity sha512-Hx1swAd8EMBZ0e+qbbfGjuxAfNIuG9bah55dSQIMMfL8za97klO3h9c9MkSK9bW1ug7terw3VN8iGivBXl6AUg== - dependencies: - lockfile "1.0.4" - -"@verdaccio/hooks@6.0.0-6-next.22": - version "6.0.0-6-next.22" - resolved "https://registry.yarnpkg.com/@verdaccio/hooks/-/hooks-6.0.0-6-next.22.tgz#b6535fa7b091e70a12b2b1d7ecfa4bb7fd60473f" - integrity sha512-FxXh7QB7rbTC+07EGnkX4cmTTrzG6CqT7dYHAaY0l+Z0w6k3/bf3euj3zgP9xAWLARJky2OVFwaQTNzo8Rf6qQ== - dependencies: - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/logger" "6.0.0-6-next.20" - core-js "3.26.1" - debug "4.3.4" - handlebars "4.7.7" - undici "4.16.0" - -"@verdaccio/loaders@6.0.0-6-next.21": - version "6.0.0-6-next.21" - resolved "https://registry.yarnpkg.com/@verdaccio/loaders/-/loaders-6.0.0-6-next.21.tgz#e7c113d29ea79e5de3273c0d5dee32b914ecf5c4" - integrity sha512-GUhqXB47Yp8LmHlbdt64JO6QrsokO7MwdKb9QPSDQRhDfOALLYahaKSurtUyKPg4UQqHw7yHTp1Gk5BsjaL49A== - dependencies: - "@verdaccio/logger" "6.0.0-6-next.20" - debug "4.3.4" - lodash "4.17.21" - -"@verdaccio/local-storage@11.0.0-6-next.22": - version "11.0.0-6-next.22" - resolved "https://registry.yarnpkg.com/@verdaccio/local-storage/-/local-storage-11.0.0-6-next.22.tgz#1ff56f74d387109fca9e14d327caea4d27b4be37" - integrity sha512-RMO0HFeAGeA3752CGw590lAN6hoSjmJCsrHaqwzec1Tko2/iNEDk5Wz9kvG9FDagmc1lFBZQ56ebQRZ0fdwf/A== - dependencies: - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/file-locking" "11.0.0-6-next.6" - "@verdaccio/utils" "6.0.0-6-next.20" - core-js "3.26.1" - debug "4.3.4" - globby "11.1.0" - lockfile "1.0.4" - lodash "4.17.21" - lowdb "1.0.0" - lru-cache "7.14.1" - sanitize-filename "1.6.3" - -"@verdaccio/logger-prettify@6.0.0-6-next.7": - version "6.0.0-6-next.7" - resolved "https://registry.yarnpkg.com/@verdaccio/logger-prettify/-/logger-prettify-6.0.0-6-next.7.tgz#f6ae99fa73dd8b339b66e699b02e45ab289cab78" - integrity sha512-XyRRs93iOD7+SeH5Kap+9R73nFDek6n0+hWdURmsItAmJ9ehfd4IaArA1WBeepXKD2RSGPhzfO+34U7KRarE5A== - dependencies: - colorette "2.0.7" - dayjs "1.11.4" - lodash "4.17.21" - pino-abstract-transport "1.0.0" - sonic-boom "3.2.0" - -"@verdaccio/logger@6.0.0-6-next.20": - version "6.0.0-6-next.20" - resolved "https://registry.yarnpkg.com/@verdaccio/logger/-/logger-6.0.0-6-next.20.tgz#520cec03c3c70363e57190a9ef0ecd6a36a681ba" - integrity sha512-wPKkrPUcW6T08M/+h6j7qWLbl5DnnpADuI1y+bNCETxT5dXq1T92AkCWKKFyB7ngHp3P6kptf02b9epXHbcU3g== - dependencies: - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/logger-prettify" "6.0.0-6-next.7" - colorette "2.0.19" - debug "4.3.4" - pino "8.7.0" - -"@verdaccio/middleware@6.0.0-6-next.31": - version "6.0.0-6-next.31" - resolved "https://registry.yarnpkg.com/@verdaccio/middleware/-/middleware-6.0.0-6-next.31.tgz#31ea54735cc697c56e3e5d58f2255e43b46f137f" - integrity sha512-DtL/rjB113ihR89tZ+21nmS5A7vUfBzH25K9CrYjBfmqJ2Rcqn4KnSRb36nA1fKeeeY/d/7QjrvmiYIZkm9vKw== - dependencies: - "@verdaccio/auth" "6.0.0-6-next.31" - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/logger" "6.0.0-6-next.20" - "@verdaccio/utils" "6.0.0-6-next.20" - body-parser "1.20.1" - debug "4.3.4" - lodash "4.17.21" - -"@verdaccio/node-api@6.0.0-6-next.52": - version "6.0.0-6-next.52" - resolved "https://registry.yarnpkg.com/@verdaccio/node-api/-/node-api-6.0.0-6-next.52.tgz#fd6a6e9f384658407277c85536b4c7bfdf52186d" - integrity sha512-oGifPyZCnywlkPwMrW8b9xSd5AX+Ccm5pelj+NBe1k0nSz8ydlL+W+n8i4W9KR7aDnkBpbwhnE+nliozbt6lbw== - dependencies: - "@verdaccio/config" "6.0.0-6-next.52" - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/logger" "6.0.0-6-next.20" - "@verdaccio/server" "6.0.0-6-next.41" - "@verdaccio/server-fastify" "6.0.0-6-next.33" - core-js "3.26.1" - debug "4.3.4" - lodash "4.17.21" - -"@verdaccio/proxy@6.0.0-6-next.30": - version "6.0.0-6-next.30" - resolved "https://registry.yarnpkg.com/@verdaccio/proxy/-/proxy-6.0.0-6-next.30.tgz#3f1ffb8fe72673d9a1c55cf8836898084dfe99b5" - integrity sha512-1ADIYyBOYKrNWW0115rZoW6pFy74MJILYMwQ+vCZSna3bggNNsVdqqwGdQp9783tE2dECDWwgpWzFnOpsJ+NqA== - dependencies: - "@verdaccio/config" "6.0.0-6-next.52" - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/local-storage" "11.0.0-6-next.22" - "@verdaccio/logger" "6.0.0-6-next.20" - "@verdaccio/utils" "6.0.0-6-next.20" - JSONStream "1.3.5" - debug "4.3.4" - got "11.8.5" - hpagent "1.2.0" - lodash "4.17.21" - undici "4.16.0" - -"@verdaccio/server-fastify@6.0.0-6-next.33": - version "6.0.0-6-next.33" - resolved "https://registry.yarnpkg.com/@verdaccio/server-fastify/-/server-fastify-6.0.0-6-next.33.tgz#980c89f804beb20d2ab3ec6186eb26b54ebb8364" - integrity sha512-RN/YhwjrGFDjcT0xHdx/YSR5Q9T5kNvnU1hlgTb1Vq8XEVWrWBQDBh7AGfzwhlVlbcS53dcUuWsOozCAudb8ng== - dependencies: - "@verdaccio/auth" "6.0.0-6-next.31" - "@verdaccio/config" "6.0.0-6-next.52" - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/logger" "6.0.0-6-next.20" - "@verdaccio/store" "6.0.0-6-next.32" - "@verdaccio/tarball" "11.0.0-6-next.21" - "@verdaccio/utils" "6.0.0-6-next.20" - core-js "3.26.1" - debug "4.3.4" - fastify "4.10.0" - fastify-plugin "4.3.0" - lodash "4.17.21" - -"@verdaccio/server@6.0.0-6-next.41": - version "6.0.0-6-next.41" - resolved "https://registry.yarnpkg.com/@verdaccio/server/-/server-6.0.0-6-next.41.tgz#62c6b51060f54460b20720c05b52c5330160ec05" - integrity sha512-XsiRiWuq0ttoETp/BqyOTWP8vwYn7WbvBriGpLGouMKGYWZ1xscIQz/EiLP24nfXfraG8zJ6KgHrYDMorGK6YQ== - dependencies: - "@verdaccio/api" "6.0.0-6-next.35" - "@verdaccio/auth" "6.0.0-6-next.31" - "@verdaccio/config" "6.0.0-6-next.52" - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/loaders" "6.0.0-6-next.21" - "@verdaccio/logger" "6.0.0-6-next.20" - "@verdaccio/middleware" "6.0.0-6-next.31" - "@verdaccio/store" "6.0.0-6-next.32" - "@verdaccio/utils" "6.0.0-6-next.20" - "@verdaccio/web" "6.0.0-6-next.39" - compression "1.7.4" - cors "2.8.5" - debug "4.3.4" - express "4.18.2" - express-rate-limit "5.5.1" - lodash "4.17.21" - verdaccio-audit "11.0.0-6-next.15" - -"@verdaccio/store@6.0.0-6-next.32": - version "6.0.0-6-next.32" - resolved "https://registry.yarnpkg.com/@verdaccio/store/-/store-6.0.0-6-next.32.tgz#a4f8846f5fbd09afcb0a33677b56a7bd1b9ccc7d" - integrity sha512-Qy3qQYCf3AyHkaLTjJSJMl5ir5pHUhvA6CowuDvnP2TnXu28Gy0Fu3ht6pscvK/QWU0umimIc4BrmRy3JgIcvA== - dependencies: - "@verdaccio/config" "6.0.0-6-next.52" - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/hooks" "6.0.0-6-next.22" - "@verdaccio/loaders" "6.0.0-6-next.21" - "@verdaccio/local-storage" "11.0.0-6-next.22" - "@verdaccio/logger" "6.0.0-6-next.20" - "@verdaccio/proxy" "6.0.0-6-next.30" - "@verdaccio/tarball" "11.0.0-6-next.21" - "@verdaccio/url" "11.0.0-6-next.18" - "@verdaccio/utils" "6.0.0-6-next.20" - JSONStream "1.3.5" - debug "4.3.4" - lodash "4.17.21" - merge2 "1.4.1" - semver "7.3.8" - -"@verdaccio/tarball@11.0.0-6-next.21": - version "11.0.0-6-next.21" - resolved "https://registry.yarnpkg.com/@verdaccio/tarball/-/tarball-11.0.0-6-next.21.tgz#27600ad8103e1389507d6f831397a86cd6a79e8a" - integrity sha512-/PV3xKZsJKh6WVzzEuPuMJ39F6epPUT0G+zbjs+XmqaMe7YaWOqwnOZUpBLQwrRa99aN5muKzQq3+5rQyeQ3Zg== - dependencies: - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/url" "11.0.0-6-next.18" - "@verdaccio/utils" "6.0.0-6-next.20" - debug "4.3.4" - lodash "4.17.21" - -"@verdaccio/ui-theme@6.0.0-6-next.52": - version "6.0.0-6-next.52" - resolved "https://registry.yarnpkg.com/@verdaccio/ui-theme/-/ui-theme-6.0.0-6-next.52.tgz#afffd2c2da1c011162a665a549c6f4d115075ba4" - integrity sha512-fbN7LYp36t17vXiIH7qmEtlNtw4LC7LvGjsUkSYhESlMYx3oCrhZdG1D8H1lvDYpn/aGYYfwUWTHGMCHKqFgLA== - -"@verdaccio/url@11.0.0-6-next.18": - version "11.0.0-6-next.18" - resolved "https://registry.yarnpkg.com/@verdaccio/url/-/url-11.0.0-6-next.18.tgz#2037b4de1899db9d2f165ca9d1dc9c65985e502c" - integrity sha512-ZhYqQ1Mp1Nd23lUsYKMxY6q/OSvsHZ1gRGjwvEzSBtoo4L3Pxopm77fnb1su1j8rMC7nA95CnN3mypIXGs88Iw== - dependencies: - "@verdaccio/core" "6.0.0-6-next.52" - debug "4.3.4" - lodash "4.17.21" - validator "13.7.0" - -"@verdaccio/utils@6.0.0-6-next.20": - version "6.0.0-6-next.20" - resolved "https://registry.yarnpkg.com/@verdaccio/utils/-/utils-6.0.0-6-next.20.tgz#72f2dfbc162a6a6b01aebd55a0dc701ece39011f" - integrity sha512-8PGwEVq31V6p5tVzQB+uTfNuQ34M/EseWOWnYxgw7pGJTn63xTJzmLKzJw3OZBqsSGDkNkfApOgRYNWLU/4HnA== - dependencies: - "@verdaccio/core" "6.0.0-6-next.52" - lodash "4.17.21" - minimatch "3.1.2" - semver "7.3.8" - -"@verdaccio/web@6.0.0-6-next.39": - version "6.0.0-6-next.39" - resolved "https://registry.yarnpkg.com/@verdaccio/web/-/web-6.0.0-6-next.39.tgz#9045e27befb265157a6219f8135c8d69e326f5c0" - integrity sha512-2z+Fyjq9ALrd2ohCY3QfTQnnneP396sVsm1DRLuz7k7EKlkleOOEjOTirN+7dLxwbTifDY+0C0UnAtVHJIEXiw== - dependencies: - "@verdaccio/auth" "6.0.0-6-next.31" - "@verdaccio/config" "6.0.0-6-next.52" - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/loaders" "6.0.0-6-next.21" - "@verdaccio/logger" "6.0.0-6-next.20" - "@verdaccio/middleware" "6.0.0-6-next.31" - "@verdaccio/store" "6.0.0-6-next.32" - "@verdaccio/tarball" "11.0.0-6-next.21" - "@verdaccio/url" "11.0.0-6-next.18" - "@verdaccio/utils" "6.0.0-6-next.20" - body-parser "1.20.1" - debug "4.3.4" - express "4.18.2" - lodash "4.17.21" - lru-cache "7.14.1" - -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== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -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" - -abortcontroller-polyfill@1.7.5: - version "1.7.5" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" - integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== - -abstract-logging@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839" - integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== - -accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv@8.11.2, ajv@^8.0.0, ajv@^8.10.0, ajv@^8.11.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" - integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -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-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" - -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" - -apache-md5@1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/apache-md5/-/apache-md5-1.1.8.tgz#ea79c6feb03abfed42b2830dde06f75df5e3bbd9" - integrity sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA== - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - -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" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -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== - -atomic-sleep@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" - integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== - -avvio@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/avvio/-/avvio-8.2.0.tgz#aff28b0266617bf07ffc1c2d5f4220c3663ce1c2" - integrity sha512-bbCQdg7bpEv6kGH41RO/3B2/GMMmJSo2iBK+X8AWN9mujtfUipMDfIjsgHCfpnKqoGEQrrmCDKSa5OQ19+fDmg== - dependencies: - archy "^1.0.0" - debug "^4.0.0" - fastq "^1.6.1" - -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= - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bcryptjs@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" - integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== - -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== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - 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.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -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, 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== - -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -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@^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== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -camelcase@^5.0.0: - 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.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== - -clipanion@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/clipanion/-/clipanion-3.1.0.tgz#3e217dd6476bb9236638b07eb4673f7309839819" - integrity sha512-v025Hz+IDQ15FpOyK8p02h5bFznMu6rLFsJSyOPR+7WrbSnZ1Ek6pblPukV7K5tC/dsWfncQPIrJ4iUy2PXkbw== - dependencies: - typanion "^3.3.1" - -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" - -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" - -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-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= - -colorette@2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -colorette@2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.7.tgz#0173393a8f1045c3b66fc8201036ef38ed0d1e7e" - integrity sha512-wSXeeDPxoi5xKvjvOGxyYlyqB3J+tbowaSsFm1rEsDsDE942aTLftbOE3XMqf3XaYC7QUtcd/3qadNAIEIsAYw== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -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= - -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== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0, 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== - -cookies@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" - integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== - dependencies: - depd "~2.0.0" - keygrip "~1.1.0" - -core-js@3.26.1: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" - integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== - -cors@2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -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== - -dayjs@1.11.4: - version "1.11.4" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.4.tgz#3b3c10ca378140d8917e06ebc13a4922af4f433e" - integrity sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g== - -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.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.3.4, debug@^4.0.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -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= - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -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== - -defer-to-connect@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -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" - -depd@2.0.0, 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 sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -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== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -ecdsa-sig-formatter@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -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== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -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" - -envinfo@7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -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-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -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== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -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== - -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@^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" - -express-rate-limit@5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2" - integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg== - -express@4.18.2: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -fast-decode-uri-component@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" - integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== - -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-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - 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" - -fast-json-stringify@^5.0.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/fast-json-stringify/-/fast-json-stringify-5.5.0.tgz#6655cb944df8da43f6b15312a9564b81c55dadab" - integrity sha512-rmw2Z8/mLkND8zI+3KTYIkNPEoF5v6GqDP/o+g7H3vjdWjBwuKpgAYFHIzL6ORRB+iqDjjtJnLIW9Mzxn5szOA== - dependencies: - "@fastify/deepmerge" "^1.0.0" - ajv "^8.10.0" - ajv-formats "^2.1.1" - fast-deep-equal "^3.1.3" - fast-uri "^2.1.0" - rfdc "^1.2.0" - -fast-querystring@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.0.0.tgz#d6151cd025d4b100e09e24045f6c35ae9ff191ef" - integrity sha512-3LQi62IhQoDlmt4ULCYmh17vRO2EtS7hTSsG4WwoKWgV7GLMKBOecEh+aiavASnLx8I2y89OD33AGLo0ccRhzA== - dependencies: - fast-decode-uri-component "^1.0.1" - -fast-redact@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.2.tgz#d58e69e9084ce9fa4c1a6fa98a3e1ecf5d7839aa" - integrity sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw== - -fast-uri@^2.0.0, fast-uri@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-2.2.0.tgz#519a0f849bef714aad10e9753d69d8f758f7445a" - integrity sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg== - -fastify-plugin@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/fastify-plugin/-/fastify-plugin-4.3.0.tgz#c6eaa87a7a0d6d1d16129e43e31d6bc1d8868e53" - integrity sha512-M3+i368lV0OYTJ5TfClIoPKEKSOF7112iiPdwgfSR0gN98BjA1Nk+c6oBHtfcVt9KiMxl+EQKHC1QNWo3ZOpYQ== - -fastify@4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/fastify/-/fastify-4.10.0.tgz#9edc2bffcd36875aef2243f3d7d1fe6486610f6a" - integrity sha512-8yQPT+c/EbETjNxwM9PHeu2U4eXMoXTva0L9zoVgv7/ZCBtovWpfK4RKexhyh5Va3Jg82HovnfCxoZmwcZDfsQ== - dependencies: - "@fastify/ajv-compiler" "^3.3.1" - "@fastify/error" "^3.0.0" - "@fastify/fast-json-stringify-compiler" "^4.1.0" - abstract-logging "^2.0.1" - avvio "^8.2.0" - find-my-way "^7.3.0" - light-my-request "^5.6.1" - pino "^8.5.0" - process-warning "^2.0.0" - proxy-addr "^2.0.7" - rfdc "^1.3.0" - secure-json-parse "^2.5.0" - semver "^7.3.7" - tiny-lru "^10.0.0" - -fastq@^1.6.0, fastq@^1.6.1: - version "1.14.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" - integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== - dependencies: - reusify "^1.0.4" - -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" - -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== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-my-way@^7.3.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/find-my-way/-/find-my-way-7.3.1.tgz#fd8a0b468a18c283e05be59f93a627f37e306cfa" - integrity sha512-kGvM08SOkqvheLcuQ8GW9t/H901Qb9rZEbcNWbXopzy4jDRoaJpJoObPSKf4MnQLZ20ZTp7rL5MpF6rf+pqmyg== - dependencies: - fast-deep-equal "^3.1.3" - fast-querystring "^1.0.0" - safe-regex2 "^2.0.0" - -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" - -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" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -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-intrinsic@^1.0.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -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" - -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" - -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-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" - -globby@11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -got@11.8.5: - version "11.8.5" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" - integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -graceful-fs@^4.1.3: - 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== - -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== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -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-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== - -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: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hpagent@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-1.2.0.tgz#0ae417895430eb3770c03443456b8d90ca464903" - integrity sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA== - -http-cache-semantics@^4.0.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-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-status-codes@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.2.0.tgz#bb2efe63d941dfc2be18e15f703da525169622be" - integrity sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng== - -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.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== - dependencies: - agent-base "6" - debug "4" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -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== - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" - integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== - -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, inherits@2.0.4: - 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== - -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-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-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-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-promise@^2.1.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" - integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== - -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-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== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -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-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -jsonwebtoken@8.5.1: - version "8.5.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" - integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== - dependencies: - jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^5.6.0" - -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== - -jwa@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" - integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" - integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== - dependencies: - jwa "^1.4.1" - safe-buffer "^5.0.1" - -keygrip@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" - integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== - dependencies: - tsscmp "1.0.6" - -keyv@^4.0.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" - integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== - dependencies: - json-buffer "3.0.1" - -kleur@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -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" - -light-my-request@^5.6.1: - version "5.8.0" - resolved "https://registry.yarnpkg.com/light-my-request/-/light-my-request-5.8.0.tgz#93b28615d4cd134b4e2370bcf2ff7e35b51c8d29" - integrity sha512-4BtD5C+VmyTpzlDPCZbsatZMJVgUIciSOwYhJDCbLffPZ35KoDkDj4zubLeHDEb35b4kkPeEv5imbh+RJxK/Pg== - dependencies: - cookie "^0.5.0" - process-warning "^2.0.0" - set-cookie-parser "^2.4.1" - -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" - -lockfile@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" - integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== - dependencies: - signal-exit "^3.0.2" - -lodash-es@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - -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.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" - integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== - -lodash.isboolean@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" - integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== - -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" - integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== - -lodash.isnumber@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" - integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== - -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - -lodash@4, lodash@4.17.21, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -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" - -lowdb@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064" - integrity sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ== - dependencies: - graceful-fs "^4.1.3" - is-promise "^2.1.0" - lodash "4" - pify "^3.0.0" - steno "^0.4.1" - -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@7.14.1: - version "7.14.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" - integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.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" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -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" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -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== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -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== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - 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.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: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -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== - -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== - -mimic-response@^3.1.0: - version "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== - -minimatch@3.0.4, 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" - -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" - -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.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -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, 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== - -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== - -nanoclone@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" - integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== - -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== - -neo-async@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -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-fetch@cjs: - 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" - -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@^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-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-assign@^4: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -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-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -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" - -on-exit-leak-free@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz#5c703c968f7e7f851885f6459bf8a8a57edc9cc4" - integrity sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w== - -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== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -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-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-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: - 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-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== - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -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-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@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -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" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -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== - -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@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pino-abstract-transport@1.0.0, pino-abstract-transport@v1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz#cc0d6955fffcadb91b7b49ef220a6cc111d48bb3" - integrity sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA== - dependencies: - readable-stream "^4.0.0" - split2 "^4.0.0" - -pino-std-serializers@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz#4c20928a1bafca122fdc2a7a4a171ca1c5f9c526" - integrity sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ== - -pino@8.7.0, pino@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-8.7.0.tgz#58621608a3d8540ae643cdd9194cdd94130c78d9" - integrity sha512-l9sA5uPxmZzwydhMWUcm1gI0YxNnYl8MfSr2h8cwLvOAzQLBLewzF247h/vqHe3/tt6fgtXeG9wdjjoetdI/vA== - dependencies: - atomic-sleep "^1.0.0" - fast-redact "^3.1.1" - on-exit-leak-free "^2.1.0" - pino-abstract-transport v1.0.0 - pino-std-serializers "^6.0.0" - process-warning "^2.0.0" - quick-format-unescaped "^4.0.3" - real-require "^0.2.0" - safe-stable-stringify "^2.3.1" - sonic-boom "^3.1.0" - thread-stream "^2.0.0" - -process-warning@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" - integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== - -process-warning@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-2.1.0.tgz#1e60e3bfe8183033bbc1e702c2da74f099422d1a" - integrity sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg== - -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== - -property-expr@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4" - integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== - -proxy-addr@^2.0.7, proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.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== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -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-format-unescaped@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" - integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -range-parser@~1.2.1: - version "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== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readable-stream@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.2.0.tgz#a7ef523d3b39e4962b0db1a1af22777b10eeca46" - integrity sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A== - dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - -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" - -real-require@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" - integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== - -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" - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -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-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: - 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@^1.1.6: - 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" - -responselike@^2.0.0: - 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" - -ret@~0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.2.2.tgz#b6861782a1f4762dce43402a71eb7a283f44573c" - integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== - -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== - -rfdc@^1.2.0, 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== - -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" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@5.1.2: - 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-buffer@5.2.1, safe-buffer@^5.0.1: - 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-regex2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/safe-regex2/-/safe-regex2-2.0.0.tgz#b287524c397c7a2994470367e0185e1916b1f5b9" - integrity sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ== - dependencies: - ret "~0.2.0" - -safe-stable-stringify@^2.3.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz#34694bd8a30575b7f94792aa51527551bd733d61" - integrity sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA== - -"safer-buffer@>= 2.1.2 < 3": - 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" - -secure-json-parse@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.6.0.tgz#95d89f84adf32d76ff7800e68a673b129fe918b0" - integrity sha512-B9osKohb6L+EZ6Kve3wHKfsAClzOC/iISA2vSuCe5Jx5NAKiwitfxx8ZKYapHXr0sYRj7UZInT7pLb3rp2Yx6A== - -semver@7.3.8, semver@^7.3.7: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@^5.5.0, semver@^5.6.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== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -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== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.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= - -set-cookie-parser@^2.4.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" - integrity sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -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" - -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== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -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= - -signal-exit@^3.0.2: - 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== - -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" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -sonic-boom@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.2.0.tgz#ce9f2de7557e68be2e52c8df6d9b052e7d348143" - integrity sha512-SbbZ+Kqj/XIunvIAgUZRlqd6CGQYq71tRRbXR92Za8J/R3Yh4Av+TWENiSiEgnlwckYLyP0YZQWVfyNC0dzLaA== - dependencies: - atomic-sleep "^1.0.0" - -sonic-boom@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.2.1.tgz#972ceab831b5840a08a002fa95a672008bda1c38" - integrity sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A== - dependencies: - atomic-sleep "^1.0.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== - -split2@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" - integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== - -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= - -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== - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -steno@^0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb" - integrity sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w== - dependencies: - graceful-fs "^4.1.3" - -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.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-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" - -thread-stream@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.2.0.tgz#310c03a253f729094ce5d4638ef5186dfa80a9e8" - integrity sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ== - dependencies: - real-require "^0.2.0" - -"through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tiny-lru@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-10.0.1.tgz#aaf5d22207e641ed1b176ac2e616d6cc2fc9ef66" - integrity sha512-Vst+6kEsWvb17Zpz14sRJV/f8bUWKhqm6Dc+v08iShmIJ/WxqWytHzCTd6m88pS33rE2zpX34TRmOpAJPloNCA== - -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" - -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== - -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" - -toposort@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" - integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -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" - -tsscmp@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" - integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== - -typanion@^3.3.1: - version "3.12.1" - resolved "https://registry.yarnpkg.com/typanion/-/typanion-3.12.1.tgz#d33deb130aba23ef6f2a3c69e7fb28148dd9089a" - integrity sha512-3SJF/czpzqq6G3lprGFLa6ps12yb1uQ1EmitNnep2fDMNh1aO/Zbq9sWY+3lem0zYb2oHJnQWyabTGUZ+L1ScQ== - -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-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -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" - -uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - -undici@4.16.0: - version "4.16.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-4.16.0.tgz#469bb87b3b918818d3d7843d91a1d08da357d5ff" - integrity sha512-tkZSECUYi+/T1i4u+4+lwZmQgLXd4BLGlrc7KZPcLIW7Jpq99+Xpc30ONv7nS6F5UNOxp/HBZSSL9MafUrvJbw== - -unix-crypt-td-js@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz#4912dfad1c8aeb7d20fa0a39e4c31918c1d5d5dd" - integrity sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw== - -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 sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -utf8-byte-length@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" - integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -validator@13.7.0: - version "13.7.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" - integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -verdaccio-audit@11.0.0-6-next.15: - version "11.0.0-6-next.15" - resolved "https://registry.yarnpkg.com/verdaccio-audit/-/verdaccio-audit-11.0.0-6-next.15.tgz#8b880a8cfae7709427204735c7a1df58619e85a0" - integrity sha512-8QhhhLpquWsmHXIYYSX0H2BiovADMvWZTunMwFWmkuA/jXfkZ1sGC3EN+WC4SjnopLnYI6lxdnmDwhZcbimSsA== - dependencies: - "@verdaccio/config" "6.0.0-6-next.52" - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/logger" "6.0.0-6-next.20" - body-parser "1.20.1" - express "4.18.2" - https-proxy-agent "5.0.1" - node-fetch cjs - -verdaccio-htpasswd@11.0.0-6-next.22: - version "11.0.0-6-next.22" - resolved "https://registry.yarnpkg.com/verdaccio-htpasswd/-/verdaccio-htpasswd-11.0.0-6-next.22.tgz#4d9d06c3cb8d09bcbb520b2a78987f70f857d72e" - integrity sha512-FWuoeqwmncVzjsDMpaKR6DMb7BF321Ojivf8K5jIlVtjh/XdxteiqSEhqqbD2xyhVer0ruzKnZKVIQua2yiMvA== - dependencies: - "@verdaccio/core" "6.0.0-6-next.52" - "@verdaccio/file-locking" "11.0.0-6-next.6" - apache-md5 "1.1.8" - bcryptjs "2.4.3" - core-js "3.26.1" - debug "4.3.4" - http-errors "1.8.1" - unix-crypt-td-js "1.1.4" - -verdaccio@6-next: - version "6.0.0-6-next.52" - resolved "https://registry.yarnpkg.com/verdaccio/-/verdaccio-6.0.0-6-next.52.tgz#d213c8648a0b1ebd53af1ff5a54376f6076924a4" - integrity sha512-Yf3AbdNQLIaqNEhZSWdIffeV7pKb6TmsAX9AUSC6eVGWztwqdngRNhyIHIG8p5dKRuY7J483BlA9xw/lljcvGg== - dependencies: - "@verdaccio/cli" "6.0.0-6-next.52" - "@verdaccio/hooks" "6.0.0-6-next.22" - "@verdaccio/logger" "6.0.0-6-next.20" - "@verdaccio/node-api" "6.0.0-6-next.52" - "@verdaccio/ui-theme" "6.0.0-6-next.52" - "@verdaccio/utils" "6.0.0-6-next.20" - verdaccio-audit "11.0.0-6-next.15" - verdaccio-htpasswd "11.0.0-6-next.22" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -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" - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -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" - -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== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.3.tgz#9b3a4c8aff9821b696275c79a8bee8399d945207" - integrity sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg== - -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-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" - -yup@0.32.11: - version "0.32.11" - resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.11.tgz#d67fb83eefa4698607982e63f7ca4c5ed3cf18c5" - integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== - dependencies: - "@babel/runtime" "^7.15.4" - "@types/lodash" "^4.14.175" - lodash "^4.17.21" - lodash-es "^4.17.21" - nanoclone "^0.2.1" - property-expr "^2.0.4" - toposort "^2.0.2" diff --git a/i18n/af.json b/i18n/af.json index f991c25ed..ed2081552 100644 --- a/i18n/af.json +++ b/i18n/af.json @@ -18,24 +18,21 @@ "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?", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Geen bord gekies nie.", "openBoardsConfig": "Kies ander bord en poort...", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", - "portLabel": "Port: {0}", "ports": "ports", "programmer": "Programeerder", "reselectLater": "Herselekteer later", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Kies Bord", "selectPortForInfo": "Please select a port to obtain board info.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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.", @@ -251,7 +250,7 @@ "selectBoard": "Kies Bord", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/ar.json b/i18n/ar.json index fff35a478..8b41c6b36 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -1,13 +1,13 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "detail": "النسخة : {0}\nالتاريخ : {1} {2}\nنسخة CLI : {3}\n{4} ", "label": "حول {0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", - "goToIoTCloud": "Go to IoT Cloud", - "goToProfile": "Go to Profile", + "goToCloudEditor": "الانتقال الى المحرر السحابي", + "goToIoTCloud": "الانتقال الى سحابة الIoT", + "goToProfile": "الانتقال الى ملف التعريف الشخصي", "menuTitle": "Arduino Cloud" }, "board": { @@ -18,24 +18,21 @@ "configDialog1": "اختر لوحة و منفذ معا اذا اردت ان ترفع السكتش", "configDialog2": "اذا قمت باختيار لوحة فقط ستسطيع ان تترجم لكن بدون ان ترفع المشروع", "couldNotFindPreviouslySelected": "تعذر ايجاد اللوحة '{0}' المختارة مسبقا في المنصة المثبتة '{1}' . الرجاء اعادة اختيار اللوحة التي تريد استعمالها يدويا . هل تريد باعادة الاختيار الان؟", - "disconnected": "Disconnected", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "الحصول على معلومات اللوحة", "inSketchbook": "(داخل ملف المشاريع)", "installNow": "نواة \"{0} {1}\" يجب تثبيتها للوحة \"{2}\" التي تم اختيارها . هل تريد تثبيتها الان ؟", - "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "FQBN غير متاح للوحة المختارة \"{0}\" . هل قمت بتثبيت النواة المعنية ؟", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "لا يوجد اية منافذ متاحة للوحة '{0}'", - "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "لم يتم اختيار اي لوحة", + "noBoardsFound": "لا يوجد لوحات ل \"{0}\"", + "noNativeSerialPort": "منفذ الاتصال التسلسلي الاساسي , تعذر الحصول على معلومات", + "noPortsDiscovered": "تعذر ايجاد منافذ", + "nonSerialPort": "منفذ اتصال غير تسلسلي , تعذر الحصول على معلومات", "openBoardsConfig": "قم باختيار لوحة و منفذ مختلفين", "pleasePickBoard": "من فضلك اختر لوحة متصلة على المنفذ الذي اخترته", "port": "المنفذ {0}", - "portLabel": "Port: {0}", "ports": "منافذ", "programmer": "المبرمجة", "reselectLater": "اعد الاختيار لاحقا", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "أبحث عن متحكم", "selectBoard": "اختر لوحة", "selectPortForInfo": "الرجاء اختيار منفذ من اجل الحصول على معلومات اللوحة", @@ -43,16 +40,17 @@ "showAllPorts": "أظهر جميع المنافذ", "succesfullyInstalledPlatform": "تم تثبيت المنصة {0}:{1} بنجاح", "succesfullyUninstalledPlatform": "تم الغاء تثبيت المنصة {0}:{1} بنجاح", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" + "typeOfPorts": "المنافذ {0}", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "لوحة غير معروفة" }, "boardsManager": "مدير اللوحة", "boardsType": { - "arduinoCertified": "Arduino Certified" + "arduinoCertified": "معتمد من قبل اردوينو" }, "bootloader": { "burnBootloader": "ثبت محمل برنامج الإقلاع", - "burningBootloader": "Burning bootloader...", + "burningBootloader": "جار حرق محمل الاقلاع", "doneBurningBootloader": "تم حرق محمل الاقلاع" }, "burnBootloader": { @@ -76,13 +74,13 @@ "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 ' ؟", @@ -93,11 +91,11 @@ "cloudSketchbook": "مشاريع على السحابة", "connected": "متصل", "continue": "استئناف", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", + "donePulling": "تم سحب '{0}' بنجاح", + "donePushing": "تم دفع '{0}' بنجاح", "embed": "تضمين:", "emptySketchbook": "ملف المشاريع الخاص بك فارغ", - "goToCloud": "Go to Cloud", + "goToCloud": "اذهب الى السحابة", "learnMore": "تعرف على المزيد", "link": "الرابط:", "notYetPulled": "تعذر الدفع الى Cloud . انها لم تسحب الى الان", @@ -117,7 +115,7 @@ "remote": "عن بعد", "share": "مشاركة...", "shareSketch": "مشاركة المشروع", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "showHideSketchbook": "اظهار/اخفاء ملف المشاريع على السحابة", "signIn": "تسجيل الدخول", "signInToCloud": "تسجيل الدخول الى Arduino Cloud", "signOut": "تسجيل الخروج", @@ -126,94 +124,99 @@ "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..." + "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": "لم يتم اختيار اي لوحة", "notConnected": "[غير متصل]", "offlineIndicator": "انت غير متصل بالانترنت على الارجح , بدون الاتصال بالانترنت لن تستطيع واجهة سطر الاوامر الخاصة بالاردوينو \"Arduino CLI\" تحميل الموارد المطلوبة و من الممكن ان تسبب باخطاء , الرجاء الاتصال بالانترنت و اعادة تشغيل البرنامج", "oldFormat": "ال '{0}' ما زالت تستخدم صيغة `.pde` القديمة . هل تريد الانتقال الى صيغة `.ino`  الجديدة ؟", - "partner": "Partner", + "partner": "شريك", "processing": "تتم المعالجة", - "recommended": "Recommended", - "retired": "Retired", + "recommended": "يُنصح به", + "retired": "متقاعد", "selectedOn": "{0} شغّل", "serialMonitor": "مراقب المنفذ التسلسلي \"سيريال بورت\"\n ", - "type": "Type", + "type": "النوع", "unknown": "غير معروف", - "updateable": "Updatable" + "updateable": "يمكن تحديثه" }, "compile": { "error": "خطا في الترجمة : {0}" }, "component": { - "boardsIncluded": "Boards included in this package:", + "boardsIncluded": "اللوحات التي تتضمنها هذه الحزمة ", "by": "بواسطة", - "clickToOpen": "Click to open in browser: {0}", + "clickToOpen": "اضغط للفتح ضمن المستعرض : {0}", "filterSearch": "ترشيح بحثك...", "install": "تنصيب", - "installLatest": "Install Latest", - "installVersion": "Install {0}", - "installed": "{0} installed", + "installLatest": "تثبيت الاحدث", + "installVersion": "تثبيت {0}", + "installed": "تم تثبيت {0}", "moreInfo": "عرض المزيد", - "otherVersions": "Other Versions", + "otherVersions": "نسخ اخرى", "remove": "حذف", - "title": "{0} by {1}", + "title": "{0} من قبل {1}", "uninstall": "الغاء التثبيت", "uninstallMsg": "هل تريد الغاء تثبيت {0}؟", - "update": "Update" + "update": "تحديث" }, "configuration": { "cli": { - "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + "inaccessibleDirectory": "تعذر الوصول الى موقع ملف المشاريع في '{0}' : '{1}'" } }, "connectionStatus": { - "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + "connectionLost": "انقطع الاتصال . المشاريع السحابية و التحديثات لن تكون متاحة" }, "contributions": { "addFile": "اضف ملف...", "fileAdded": "تمت اضافة ملف واحد الى المشروع", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "تعذر فتح راسم اشارة المنفذ التسلسلي" }, "replaceTitle": "استبدال" }, "core": { "compilerWarnings": { - "all": "All", - "default": "Default", - "more": "More", - "none": "None" + "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", + "createCloudCopy": "دفع المشروع الى السحابة", "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" + "restart": "اعادة تشغيل الناطر", + "start": "تشغيل الناطر", + "stop": "ايقاف الناطر" }, "debug": { "debugWithMessage": "تصحيح برمجي - {0}", "debuggingNotSupported": "'{0}' لا يقبل التصحيح البرمجي", "noPlatformInstalledFor": "المنصة غير مثبتة ل '{0}'", "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?" + "sketchIsNotCompiled": "المشروع '{0}' يجب ان يتم التحقق منه قبل بدء جلسة تصحيح الاخطاء . الرجاء التحقق من المشروع و اعادة تشغيل مصحح الاخطاء مرة اخرى .\nهل تريد التحقق من المشروع الان؟" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "لا تسأل مرة اخرى" @@ -228,11 +231,7 @@ "increaseIndent": "زيادة مسافة البادئة", "nextError": "الخطأ التالي", "previousError": "الخطأ السابق", - "revealError": "Reveal Error" - }, - "electron": { - "couldNotSave": "تعذر حفظ المشروع . الرجاء نسخ عملك الغير محفوظ الى محرر النصوص المفضل لديك و اعادة تشغيل Arduino IDE", - "unsavedChanges": "اي تغييرات لم تحفظ لن يتم حفظها" + "revealError": "الكشف عن الاخطاء" }, "examples": { "builtInExamples": "الأمثلة المدمجة", @@ -251,7 +250,7 @@ "selectBoard": "اختر لوحة", "selectVersion": "اختر نسخة البرامج الثابتة", "successfullyInstalled": "تم تثبيت البرامج الثابتة بنجاح", - "updater": "محدث البرامج الثابتة ل WiFi101 / WiFiNINA " + "updater": "Firmware Updater" }, "help": { "environment": "البيئة", @@ -266,7 +265,7 @@ "visit": "زيارة Arduino.cc" }, "ide-updater": { - "checkForUpdates": "Check for Arduino IDE Updates", + "checkForUpdates": "جار التحقق من التحديثات لـ Arduino IDE", "closeAndInstallButton": "قم بالاغلاق و التحديث", "closeToInstallNotice": "اغلق البرمجية و حّدث الجهاز الخاص بك ", "downloadButton": "حمّل", @@ -282,16 +281,20 @@ "updateAvailable": "يوجد تحديث", "versionDownloaded": "لقد تم تحميل {0} Arduino IDE" }, + "installable": { + "libraryInstallFailed": "تعذر تثبيت المكتبة : '{0}{1}'", + "platformInstallFailed": "تعذر تثبيت المنصة : '{0}{1}'" + }, "library": { "addZip": "اضف مكتبة .ZIP ...", "arduinoLibraries": "مكتبات Arduino", "contributedLibraries": "المكتبات التي سوهم بها", "include": "ضمّن مكتبة", - "installAll": "Install All", - "installLibraryDependencies": "Install library dependencies", + "installAll": "تثبيت الكل", + "installLibraryDependencies": "تثبيت ملحقات المكتبة", "installMissingDependencies": "هل تريد تثبيت التبعيات المفقودة؟", "installOneMissingDependency": "هل تريد تثبيت التبعية المفقودة ؟", - "installWithoutDependencies": "Install without dependencies", + "installWithoutDependencies": "التثبيت بدون الملحقات", "installedSuccessfully": "تم تثبيت المكتبة {0}:{1} بنجاح", "libraryAlreadyExists": "المكتبة موجودة مسبقا . هل تريد الكتابة فوقها ؟", "manageLibraries": "ادارة المكتبات", @@ -305,22 +308,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": "متقدم", @@ -328,22 +331,22 @@ "tools": "ادوات" }, "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "alreadyConnectedError": "تعذر الاتصال الى {0} منفذ {1} لانه تم الاتصال مسبقا", "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.", + "connectionFailedError": "تعذر الاتصال الى منفذ {0} {1}", + "connectionFailedErrorWithDetails": "{0} تعذر الاتصال ب{1} منفذ {2} ", + "connectionTimeout": "نفذ الوقت . Arduino IDE لم يتلقَّ رسالة 'نجاح' من الشاشة بعد الاتصال بها بنجاح", + "missingConfigurationError": "تعذر الاتصال الى منفذ {0} {1} . اعدادات التهيئة للشاشة غير موجودة", + "notConnectedError": "غير متصل الى المنفذ {0} {1}", "unableToCloseWebSocket": "تعذر اغلاق مقبس الويب", "unableToConnectToWebSocket": "تعذر الاتصال بمقبس الويب" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "اسم المشروع السحابي الجديد" }, "portProtocol": { "network": "شبكة", - "serial": "Serial" + "serial": "تسلسلي" }, "preferences": { "additionalManagerURLs": "مدير اللوحات الاضافية", @@ -354,7 +357,7 @@ "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 افتراضيا", @@ -363,8 +366,8 @@ "cloud.pushpublic.warn": "True اذا كان يجب تحذير المستخدمين قبل دفع مشروع عام الى السحابة . True افتراضيا", "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": "تحذيرات المترجم", @@ -379,77 +382,79 @@ "invalid.sketchbook.location": "موقع ملف المشروع غير صالح : {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.", + "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": "اختر مكان المشروع الجديد", - "noCliConfig": "Could not load the CLI configuration", + "noCliConfig": "تعذر تحميل اعدادات تهيئة ال CLI", "noProxy": "لا يوجد وكيل", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "اسم المستضيف", + "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." + "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.", + "survey.notification": "مفعل اذا اراد المستخدم ان يتم تبليغه في حالوجود استطلاع راي . مفعل بشكل افتراضي", "unofficialBoardSupport": "انقر لعرض قائمة عناوين URL للوحات المدعومة بشكل غير رسمي", "upload": "الرفع", "upload.verbose": "True لخرج الرفع المطول . False افتراضيا", "verifyAfterUpload": "التحقق من الكود بعد الرفع", "window.autoScale": "True اذا كان مقياس الواجهة يتزامن تلقائيا مع حجم الخط ", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "متقاعد. استخدم 'window.zoomLevel' بدلا من ذلك" } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "اسم جديد للمشروع السحابي" }, "replaceMsg": "هل تريد استبدال النسخة الحالية من {0} ؟", "selectZip": "اختر ملف .zip يحوي المكتبة التي تريد اضافتها", "serial": { "autoscroll": "تمرير تلقائي", "carriageReturn": "اعادة الحمل", - "connecting": "Connecting to '{0}' on '{1}'...", - "message": "Message (Enter to send message to '{0}' on '{1}')", + "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": "Configure and Upload", + "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?", + "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": "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.", + "invalidCloudSketchName": "يجب ان بيدا الاسم بحرف , رقم , او شرطة سفلية _ , و يلحق به حرف , رقم , شرطة - , شرطة سفلية _ و نقطة . اكبر طول ممكن هو 36 محرف", + "invalidSketchFolderLocationDetails": "لا يمكنك حفظ المشروع داخل ملف موجود ضمن ملفات المشروع اصلا", + "invalidSketchFolderLocationMessage": "موقع ملف المشروع '{0}' غير صالح", + "invalidSketchFolderNameMessage": "اسم مجلد المشروع '{0}' غير صالح ", + "invalidSketchName": "يجب ان بيدا الاسم بحرف , رقم , او شرطة سفلية _ , و يلحق به حرف , رقم , شرطة - , شرطة سفلية _ و نقطة . اكبر طول ممكن هو 63 محرف", "moving": "يتم النقل", "movingMsg": "الملف \"{0}\" يجب ان يكون داخل مجلد مشروع مسمى \"{1}\"\nهل انشئ المجلد , ثم انقل الملف و اكمل ؟", - "new": "New Sketch", - "noTrailingPeriod": "A filename cannot end with a dot", + "new": "مشروع جديد", + "noTrailingPeriod": "لا يمكن ان ينتهي اسم الملف بنقطة", "openFolder": "فتح المجلد", "openRecent": "فُتِحَ مؤخرا ", "openSketchInNewWindow": "فتح المشروع في نافذة جديدة", - "reservedFilename": "'{0}' is a reserved filename.", + "reservedFilename": "'{0}' هو اسم ملف محجوز مسبقا", "saveFolderAs": "احفظ مجلد المشروع باسم", "saveSketch": "احفظ ملف المشروع لفتحه مرة اخرى لاحقا", "saveSketchAs": "حفظ ملف المشروع باسم ...", @@ -460,14 +465,14 @@ "titleSketchbook": "مجلد المشاريع", "upload": "رفع", "uploadUsingProgrammer": "الرفع باستخدام مبرمجة", - "uploading": "Uploading...", + "uploading": "جار التحديث ....", "userFieldsNotFoundError": "تعذر ايجاد حقول المستخدم للوحة المتصلة", "verify": "تحقق", "verifyOrCompile": "تحقق/ترجم" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "مشروع سحابي جديد", + "newSketch": "مشروع جديد" }, "survey": { "answerSurvey": "الاجابة على الاستبيان", @@ -475,39 +480,40 @@ "surveyMessage": "يرجى ان تساعدنا لنحسن ادائنا من خلال الاجابة على هذا الاستبيان القصير جدا . نحن نحترم المجتمع الخاص بنا و نريد ان نتعرف بشكل افضل على داعمينا " }, "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": "High Contrast", - "light": "Light", - "user": "{0} (user)" + "currentThemeNotFound": "تعذر الحصول على السمة التي تم اختيارها : {0} . Arduino IDE اختار سمات موجودة مسبقا و متوافقة مع السمة الغير متوفرة", + "dark": "غامق", + "deprecated": "{0} (متقاعد)", + "hc": "غامق ذو تباين عالٍ", + "hcLight": "فاتح ذو تباين عال", + "light": "فاتح", + "user": "{0} (المستخدم)" }, "title": { - "cloud": "Cloud" + "cloud": "السحابة" }, "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" + "updateIndexes": "تحديث الفهارس", + "updateLibraryIndex": "تحديث فهرس المكتبات", + "updatePackageIndex": "تحديث فهرس الحزم" }, "upload": { "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" + "abortFixMessage": "المشروع ما يزال غير صالح . هل تريد اصلاح المشاكل المتبقية ؟ من خلال ضغط '{0}' , سيتم فتح مشروع جديد", + "abortFixTitle": "مشروع غير صالح", + "renameSketchFileMessage": "لا يمكن استخدام ملف المشروع '{0}' . {1} هل تريد اعادة تسمية المشروع الان ؟", + "renameSketchFileTitle": "اسم المشروع غير صالح", + "renameSketchFolderMessage": "لا يمكن استخدام المشروع '{0}' , {1} قم باعادة تسمية المشروع للتخلص من هذه الرسالة . هل تريد اعادة تسمية المشروع الان؟", + "renameSketchFolderTitle": "اسم المشروع غير صالح" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}' موجود مسبقا" } }, "theia": { @@ -528,8 +534,8 @@ "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?", + "deleteCloudSketch": "سيتم حذف المشروع السحابي '{0}' بشكل دائم من سيرفرات اردوينو و المخازن المحلية . هذا الاجراء لا يمكن التراجع عنه . هل تريد حذف المشروع الحالي؟", + "deleteCurrentSketch": "سيتم حذف المشروع '{0}' بشكل دائم . هذا الاجراء لا يمكن التراجع عنه . هل تريد حذف المشروع الحالي؟", "fileNewName": "اسم الملف الجديد", "invalidExtension": "\".{0}\" امتداد غير صالح", "newFileName": "الاسم الجديد لملف" diff --git a/i18n/az.json b/i18n/az.json index 99fd7271a..acf39a361 100644 --- a/i18n/az.json +++ b/i18n/az.json @@ -18,24 +18,21 @@ "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?", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", "openBoardsConfig": "Select other board and port…", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", - "portLabel": "Port: {0}", "ports": "ports", "programmer": "Proqramlayıcı", "reselectLater": "Daha Sonra Yenidən Seç", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Select Board", "selectPortForInfo": "Please select a port to obtain board info.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Uğurla Silindi Platforma {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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.", @@ -251,7 +250,7 @@ "selectBoard": "Select Board", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/bg.json b/i18n/bg.json index a5ea1899f..a03b75b4c 100644 --- a/i18n/bg.json +++ b/i18n/bg.json @@ -18,24 +18,21 @@ "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}“. Искате ли да го инсталирате сега?", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "FQBN не е наличен за избраната платка „{0}“. Имате ли инсталирано съответното ядро?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Няма избрани портове за платка: „{0}“.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Няма избрани платка.", "openBoardsConfig": "Изберете друга платка и порт...", "pleasePickBoard": "Моля, изберете платка, свързана към порта, който сте избрали.", "port": "Порт{0}", - "portLabel": "Port: {0}", "ports": "ports", "programmer": "Програматор", "reselectLater": "Изберете отново по-късно", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Изберете платка", "selectPortForInfo": "Моля, изберете порт, за да получите информация за платката.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Успешно инсталирана платформа {0}:{1}", "succesfullyUninstalledPlatform": "Успешно деинсталирана платформа {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Мениджър на платки", @@ -215,6 +213,11 @@ "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": "Не питай отново" }, @@ -230,10 +233,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Скицата не можа да бъде запазена. Моля, копирайте незапазената си работа в любимия си текстов редактор и рестартирайте IDE-то.", - "unsavedChanges": "Всички незапазени промени няма да бъдат запазени." - }, "examples": { "builtInExamples": "Вградени примери", "couldNotInitializeExamples": "Не можа да се инициализира вградените примери.", @@ -251,7 +250,7 @@ "selectBoard": "Изберете платка", "selectVersion": "Изберете версия на фърмуера", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Околна среда", @@ -282,6 +281,10 @@ "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 библиотеки", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "sketch": { "archiveSketch": "Архивирай скица", "cantOpen": "Папка с име „{0}“ вече съществува. Не може да се отвори скица.", - "close": "Наистина ли искате да затворите скицата?", "compile": "Compiling sketch...", "configureAndUpload": "Configure and Upload", "createdArchive": "Създаден е архив „{0}“.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/bn.json b/i18n/bn.json deleted file mode 100644 index 08a47309e..000000000 --- a/i18n/bn.json +++ /dev/null @@ -1,538 +0,0 @@ -{ - "arduino": { - "about": { - "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", - "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", - "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?", - "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", - "ports": "ports", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "searchBoard": "Search board", - "selectBoard": "Select Board", - "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}", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" - }, - "boardsManager": "Boards Manager", - "boardsType": { - "arduinoCertified": "Arduino Certified" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning 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." - }, - "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 '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" - }, - "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", - "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": "Share...", - "shareSketch": "Share Sketch", - "showHideSketchbook": "Show/Hide Cloud 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." - }, - "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", - "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", - "selectedOn": "on {0}", - "serialMonitor": "Serial Monitor", - "type": "Type", - "unknown": "Unknown", - "updateable": "Updatable" - }, - "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": "Remove", - "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}'", - "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?" - }, - "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" - }, - "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": { - "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." - }, - "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "include": "Include Library", - "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?", - "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 {0}:{1} needs some other dependencies currently not installed:", - "needsOneDependency": "The library {0}:{1} 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.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", - "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.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": { - "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.", - "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.", - "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", - "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" - }, - "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" - }, - "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." - }, - "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": "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" - }, - "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/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 {0}:{1} needs another dependency currently not installed:", - "needsMultipleDependencies": "The library {0}:{1} 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 224a0cd01..53d1b8089 100644 --- a/i18n/ca_ES.json +++ b/i18n/ca_ES.json @@ -18,24 +18,21 @@ "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?", - "disconnected": "Desconnectada", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Obtín informació de la placa", "inSketchbook": "(al quadern de programes)", "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}\"", - "noFQBN": "El FQBN no està disponible per la placa seleccionada \"{0}\". Tens instal·lat el nucli corresponent?", "noNativeSerialPort": "No s'ha pogut obtenir informació del port série natiu.", "noPortsDiscovered": "No s'ha trobat cap port", - "noPortsSelected": "No hi ha cap port seleccionat per a la placa: \"{0}\".", "nonSerialPort": "No s'ha pogut obtenir informació del port no série.", - "noneSelected": "No s'ha seleccionat cap placa.", "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": "Torna a triar més tard", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Busca una placa", "selectBoard": "Tria una placa", "selectPortForInfo": "Tria un port per obtenir informació de la placa.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Plataforma instal·lada correctament {0}:{1}", "succesfullyUninstalledPlatform": "Plataforma desinstal·lada correctament {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Placa desconeguda" }, "boardsManager": "Gestor de plaques", @@ -215,6 +213,11 @@ "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": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, "dialog": { "dontAskAgain": "No ho tornis a preguntar" }, @@ -230,10 +233,6 @@ "previousError": "Error anterior", "revealError": "Mostra l'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 es perdran." - }, "examples": { "builtInExamples": "Exemples incorporats", "couldNotInitializeExamples": "No es poden inicialitzar els exemples incorporats.", @@ -251,7 +250,7 @@ "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" + "updater": "Firmware Updater" }, "help": { "environment": "Entorn", @@ -282,6 +281,10 @@ "updateAvailable": "Actualització disponible", "versionDownloaded": "L'IDE d'Arduino {0} s'ha descarregat" }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Afegeix llibreria .ZIP...", "arduinoLibraries": "Llibreries d'Arduino", @@ -328,13 +331,13 @@ "tools": "Eines" }, "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.", + "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" }, @@ -381,6 +384,9 @@ "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": "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", @@ -415,7 +421,7 @@ "serial": { "autoscroll": "Desplaçament automàtic", "carriageReturn": "Retorn de carro", - "connecting": "Connecting to '{0}' on '{1}'...", + "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", @@ -428,7 +434,6 @@ "sketch": { "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": "Compilant el programa...", "configureAndUpload": "Configura i puja", "createdArchive": "S'ha creat l'arxiu \"{0}\".", @@ -475,12 +480,13 @@ "surveyMessage": "Ajuda'ns a millorar contestant aquesta enquesta súper curta. Valorem la nostra comunitat i volem conéixer els nostres usuaris un poc millor." }, "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": "High Contrast", - "light": "Light", - "user": "{0} (user)" + "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": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "Clar", + "user": "{0} (usuari)" }, "title": { "cloud": "Núvol" diff --git a/i18n/cs.json b/i18n/cs.json index 10fc40e72..1e08e82aa 100644 --- a/i18n/cs.json +++ b/i18n/cs.json @@ -18,24 +18,21 @@ "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": "Odpojeno", + "editBoardsConfig": "Edit Board and 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?", "noBoardsFound": "Nenalezeny žádné desky pro \"{0}\"", - "noFQBN": "FQBN není dostupné pro zvolenou desku \"{0}\". Máte nainstalované příslušné jádro? ", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "Nenalezeny žádné porty", - "noPortsSelected": "Nebyl zvolen port pro desku '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Nebyla zvolena deska.", "openBoardsConfig": "Zvolte jinou desku a port...", "pleasePickBoard": "Vyberte prosím desku která je připojená k zvolenému portu. ", "port": "Port {0}", - "portLabel": "Port:{0}", "ports": "porty", "programmer": "Programátor", "reselectLater": "Zvolit později", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Vyhledat desku", "selectBoard": "Zvolit desku", "selectPortForInfo": "Prosím zvolte port pro získání informací o desce.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Platforma {0}:{1} byla úspěšně nainstalována.", "succesfullyUninstalledPlatform": "Platforma {0}:{1} byla úspěšně odinstalována.", "typeOfPorts": "{0}porty", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Neznámá deska" }, "boardsManager": "Manažér desek", @@ -215,6 +213,11 @@ "optimizeForDebugging": "optimalizovat pro 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": "Znovu se neptat" }, @@ -230,10 +233,6 @@ "previousError": "Předchozí chyba", "revealError": "Zobrazit Chybu" }, - "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. " - }, "examples": { "builtInExamples": "Vestavěné příklady.", "couldNotInitializeExamples": "Nebylo možné inicializovat vestavěné příklady.", @@ -251,7 +250,7 @@ "selectBoard": "Zvolit desku", "selectVersion": "Zvolit verzi firmwaru", "successfullyInstalled": "Firmware byl úspěšně nainstalován. ", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Prostředí", @@ -282,6 +281,10 @@ "updateAvailable": "Je dostupná aktualizace", "versionDownloaded": "Arduino IDE {0}bylo staženo." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Přidat .ZIP knihovnu...", "arduinoLibraries": "Arduino knihovny", @@ -381,6 +384,9 @@ "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.", "manualProxy": "Ruční nastavení 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": "Síť", "newSketchbookLocation": "Zvolit nové umístění projektů", "noCliConfig": "Could not load the CLI configuration", @@ -428,7 +434,6 @@ "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...", "configureAndUpload": "Configure and Upload", "createdArchive": "Vytvořen archív '{0}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/da.json b/i18n/da.json deleted file mode 100644 index 08a47309e..000000000 --- a/i18n/da.json +++ /dev/null @@ -1,538 +0,0 @@ -{ - "arduino": { - "about": { - "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", - "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", - "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?", - "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", - "ports": "ports", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "searchBoard": "Search board", - "selectBoard": "Select Board", - "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}", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" - }, - "boardsManager": "Boards Manager", - "boardsType": { - "arduinoCertified": "Arduino Certified" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning 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." - }, - "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 '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" - }, - "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", - "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": "Share...", - "shareSketch": "Share Sketch", - "showHideSketchbook": "Show/Hide Cloud 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." - }, - "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", - "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", - "selectedOn": "on {0}", - "serialMonitor": "Serial Monitor", - "type": "Type", - "unknown": "Unknown", - "updateable": "Updatable" - }, - "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": "Remove", - "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}'", - "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?" - }, - "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" - }, - "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": { - "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." - }, - "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "include": "Include Library", - "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?", - "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 {0}:{1} needs some other dependencies currently not installed:", - "needsOneDependency": "The library {0}:{1} 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.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", - "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.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": { - "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.", - "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.", - "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", - "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" - }, - "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" - }, - "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." - }, - "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": "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" - }, - "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/de.json b/i18n/de.json index f36fe6e4c..9bdcddaa7 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -5,8 +5,8 @@ "label": "Über {0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", - "goToIoTCloud": "Go to IoT Cloud", + "goToCloudEditor": "Zum Cloud-Editor gehen", + "goToIoTCloud": "Zur IoT-Cloud gehen", "goToProfile": "Profil aufrufen", "menuTitle": "Arduino-Cloud" }, @@ -18,24 +18,21 @@ "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 Plattform '{1}' gefunden. Bitte Board erneut auswählen. Jetzt auswählen?", - "disconnected": " Verbindung getrennt", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Board-Informationen abrufen", "inSketchbook": "(im Sketchbook)", "installNow": "Der \"{0} {1}\" Core muss für das ausgewählte \"{2}\" Board installiert werden. Jetzt installieren?", "noBoardsFound": "Für \"{0}\" wurden keine Boards gefunden.", - "noFQBN": "Der FQBN ist für das gewählte Board \"{0}\" nicht verfügbar. Wurde der zugehörige Core installiert?", "noNativeSerialPort": "Nativer serieller Port, keine Informationen verfügbar.", "noPortsDiscovered": "Keine Ports gefunden", - "noPortsSelected": "Kein Port für das Board : '{0}' ausgewählt.", "nonSerialPort": "Nicht-serieller Port, keine Informationen verfügbar.", - "noneSelected": "Kein Board ausgewählt.", "openBoardsConfig": "Wähle einen anderes Board und einen anderen Port...", "pleasePickBoard": "Bitte wählen Sie das Board, welches am ausgewählten Port angeschlossen ist.", "port": "Port{0}", - "portLabel": "Port{0}", "ports": "Ports", "programmer": "Programmer", "reselectLater": "Später auswählen", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Board suchen", "selectBoard": "Board wählen", "selectPortForInfo": "Wähle ein Port, um Informationen über das Board zu erhalten.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Plattform erfolgreich installiert {0}:{1}", "succesfullyUninstalledPlatform": "Plattform erfolgreich deinstalliert {0}:{1}", "typeOfPorts": "{0} Ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unbekanntes Board" }, "boardsManager": "Board-Verwaltung", @@ -117,7 +115,7 @@ "remote": "Remote", "share": "Teilen....", "shareSketch": "Sketch teilen", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "showHideSketchbook": "Zeige/Verstecke Cloud Sketchbook", "signIn": "Anmelden", "signInToCloud": "Anmelden zur Arduino Cloud", "signOut": "Abmelden", @@ -130,10 +128,10 @@ "creating": "Cloud-Sketch '{0}' wird erstellt...", "new": "Neuer Cloud-Sketch", "notFound": "Cloud-Sketch '{0}' konnte nicht heruntergeladen werden. Er existiert nicht.", - "pulling": "Synchronizing sketchbook, pulling '{0}'...", - "pushing": "Synchronizing sketchbook, pushing '{0}'...", + "pulling": "Synchronisiere Sketchbook, lade '{0}' runter...", + "pushing": "Synchronisiere Sketchbook, lade '{0}' hoch...", "renaming": "Cloud-Sketch wird von '{0}' nach '{1}' umbenannt ...", - "synchronizingSketchbook": "Synchronizing sketchbook..." + "synchronizingSketchbook": "Synchronisiere Sketchbook..." }, "common": { "all": "Alle", @@ -160,10 +158,10 @@ "component": { "boardsIncluded": "In diesem Paket enthaltene Boards:", "by": "von", - "clickToOpen": "Click to open in browser: {0}", + "clickToOpen": "Klicken, um im Browser zu öffnen: {0}", "filterSearch": "Filtern Sie Ihre Suche ...", "install": "Installieren", - "installLatest": "Install Latest", + "installLatest": "Neueste installieren", "installVersion": "Installiere {0}", "installed": "{0} installiert", "moreInfo": "Mehr Information", @@ -176,11 +174,11 @@ }, "configuration": { "cli": { - "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + "inaccessibleDirectory": "Kein Zugriff möglich auf Sketchbook-Ort bei '{0}': {1}" } }, "connectionStatus": { - "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + "connectionLost": "Verbindung verloren. Cloud-Sketch Aktionen und Updates werden nicht verfügbar sein." }, "contributions": { "addFile": "Datei hinzufügen...", @@ -213,7 +211,12 @@ "debuggingNotSupported": "'{0}' unterstützt kein Debuggen", "noPlatformInstalledFor": "Die Platform für '{0}' ist nicht instaliert.", "optimizeForDebugging": "Für Debugging optimieren", - "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?" + "sketchIsNotCompiled": "Der Sketch '{0}' muss vor dem Starten einer Debugging-Sitzung überprüft werden. Bitte überprüfe den Sketch und starte das Debugging erneut. Möchtest du den Sketch jetzt überprüfen?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "Nicht noch einmal fragen" @@ -230,10 +233,6 @@ "previousError": "Vorheriger Fehler", "revealError": "Fehler zeigen" }, - "electron": { - "couldNotSave": "Der Sketch konnte nicht gespeichert werden. Bitte kopieren Sie Ihre ungespeicherte Arbeit in Ihren bevorzugten Texteditor und starten Sie die IDE neu.", - "unsavedChanges": "Alle ungesicherten Änderung werden nicht gespeichert." - }, "examples": { "builtInExamples": "Mitgelieferte Beispiele", "couldNotInitializeExamples": "Mitgelieferte Beispiele konnten nicht initialisiert werden", @@ -251,7 +250,7 @@ "selectBoard": "Board auswählen", "selectVersion": "Firmware Version wählen", "successfullyInstalled": "Firmware wurde erfolgreich installiert.", - "updater": "WiFi101 / WiFiNINA Firmware Aktualisierer" + "updater": "Firmware Updater" }, "help": { "environment": "Umgebung", @@ -282,6 +281,10 @@ "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", @@ -328,13 +331,13 @@ "tools": "Werkzeuge" }, "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.", + "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": "Zeitüberschreitung. Die IDE hat die 'success'-Nachricht nach erfolgreicher Verbindung nicht vom Monitor erhalten.", + "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" }, @@ -381,6 +384,9 @@ "language.log": "Wenn aktivert, werden Arduino-Sprach-Server-Logdateien in den Sketch-Ordner geschrieben. Standardgemäß deaktivert.", "language.realTimeDiagnostics": "Wenn aktiviert, bietet der Sprachserver bei der Eingabe im Editor eine Echtzeitdiagnose. Ist standardmäßig deaktiviert.", "manualProxy": "Manuelle Proxy Einstellung", + "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": "Netzwerk", "newSketchbookLocation": "Wähle einen neuen Ort für das Sketchbook ", "noCliConfig": "CLI-Konfiguration konnte nicht geladen werden", @@ -415,7 +421,7 @@ "serial": { "autoscroll": "Automatisch scrollen", "carriageReturn": "Zeilenumbruch", - "connecting": "Connecting to '{0}' on '{1}'...", + "connecting": "Verbindung zu '{0}' auf '{1}'...", "message": "Nachicht (Enter um Nachricht für '{0}' auf '{1}' zu senden)", "newLine": "Neue Zeile", "newLineCarriageReturn": "Sowohl NL als auch CR", @@ -428,7 +434,6 @@ "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": "Kompiliere Sketch ...", "configureAndUpload": "Konfigurieren und Hochladen", "createdArchive": "Archiv '{0}' erstellt.", @@ -438,8 +443,8 @@ "editInvalidSketchFolderQuestion": "Wollen Sie versuchen, den Sketch mit einem anderen Namen abzuspeichern?", "exportBinary": "Kompilierte Binärdatei exportieren", "invalidCloudSketchName": "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 36 Zeichen.", - "invalidSketchFolderLocationDetails": "You cannot save a sketch into a folder inside itself.", - "invalidSketchFolderLocationMessage": "Invalid sketch folder location: '{0}'", + "invalidSketchFolderLocationDetails": "Ein Sketch kann nicht innerhalb einem 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": "Übertragen...", @@ -475,12 +480,13 @@ "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." }, "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": "High Contrast", - "light": "Light", - "user": "{0} (user)" + "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" diff --git a/i18n/el.json b/i18n/el.json index f69125e70..538e76385 100644 --- a/i18n/el.json +++ b/i18n/el.json @@ -18,24 +18,21 @@ "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}. Θέλεις να την εγκαταστήσεις τώρα;", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Δεν επιλέχθηκε θύρα για την πλακέτα: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Δεν επιλέχθηκε πλακέτα", "openBoardsConfig": "Επιλογή διαφορετικής πλακέτας και θύρας...", "pleasePickBoard": "Πσρακαλώ επίλεξε μια πλακέτα που συνδέθηκε στην θύρα που έχεις επιλέξει.", "port": "Θύρα{0}", - "portLabel": "Port: {0}", "ports": "ports", "programmer": "Προγραμματιστής", "reselectLater": "Επιλογή αργότερα", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Επιλογή Πλακέτας", "selectPortForInfo": "Παρακαλώ επίλεξε μια θύρα για εμφάνιση πληροφοριών πλακέτας.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Επιτυχής εγκατάσταση πλατφόρμας {0}:{1}", "succesfullyUninstalledPlatform": "Επιτυχής απεγκατάσταση πλατφόρμας {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Διαχειριστής Πλακετών", @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,6 @@ "previousError": "Previous Error", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Δεν έγινε αποθήκευση του προγράμματος. Παρακαλώ αντιγράψτε ό,τι δεν έχει αποθηκευθεί στον αγαπημένο σας επεξεργαστή κειμένου, και επανεκινήστε το Ολοκληρωμένο Περιβάλλον Ανάπτυξης IDE.", - "unsavedChanges": "Οι μη αποθηκευμένες αλλαγές θα χαθούν." - }, "examples": { "builtInExamples": "Built-in examples", "couldNotInitializeExamples": "Could not initialize built-in examples.", @@ -251,7 +250,7 @@ "selectBoard": "Επιλογή Πλακέτας", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Περιβάλλον", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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", + "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", @@ -428,7 +434,6 @@ "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}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/en.json b/i18n/en.json index 08a47309e..91b37f6a1 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -18,24 +18,21 @@ "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?", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", "openBoardsConfig": "Select other board and port…", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", - "portLabel": "Port: {0}", "ports": "ports", "programmer": "Programmer", "reselectLater": "Reselect later", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Select Board", "selectPortForInfo": "Please select a port to obtain board info.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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.", @@ -251,7 +250,7 @@ "selectBoard": "Select Board", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/es.json b/i18n/es.json index 6cb212da6..8e8109fa5 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -18,24 +18,21 @@ "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?", "noBoardsFound": "No se han encotrado placas para \"{0}\"", - "noFQBN": "El FQBN no está disponible para la placa seleccionada \"{0}\". ¿Tienes instalado el núcleo correspondiente?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No se ha descubierto ningún puerto", - "noPortsSelected": "No se han seleccionado puertos para la placa: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Ninguna placa seleccionada.", "openBoardsConfig": "Seleccione otra placa y puerto...", "pleasePickBoard": "Por favor, elija una placa conectada al puerto que haya seleccionado.", "port": "Puerto {0}", - "portLabel": "Puerto: {0}", "ports": "puertos", "programmer": "Programador", "reselectLater": "Vuelve a seleccionar más tarde", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Buscar placa", "selectBoard": "Seleccionar Placa", "selectPortForInfo": "Por favor, seleccione un puerto para obtener información sobre la placa.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Plataforma {0}:{1} instalada correctamente", "succesfullyUninstalledPlatform": "Plataforma {0}:{1} desinstalada correctamente", "typeOfPorts": "{0} puertos", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Placa desconocida" }, "boardsManager": "Gestor de placas", @@ -215,6 +213,11 @@ "optimizeForDebugging": "Optimizar para depuración", "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": "No volver a preguntar" }, @@ -230,10 +233,6 @@ "previousError": "Error Anterior", "revealError": "Revelar 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." - }, "examples": { "builtInExamples": "Ejemplos Construidos", "couldNotInitializeExamples": "No se han podido inicializar los ejemplos integrados.", @@ -251,7 +250,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)", @@ -282,6 +281,10 @@ "updateAvailable": "Actualización disponible", "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", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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": "Compilando proyecto...", "configureAndUpload": "Configura y Subir", "createdArchive": "Archivo '{0}' creado.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/eu.json b/i18n/eu.json index 1603763c3..9e6dfdd6a 100644 --- a/i18n/eu.json +++ b/i18n/eu.json @@ -18,24 +18,21 @@ "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?", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "FQBN ez dago erabilgarri hautatutako \"{0}\" plakarentzat. Dagokion nukleoa instalatuta daukazu?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Ez da atakarik hautatu plakarentzat: '{0}'", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Plakarik ez da hautatu", "openBoardsConfig": "Hautatu beste plaka eta ataka bat...", "pleasePickBoard": "Aukeratu hautatu duzun atakara konektatutako plaka bat.", "port": "{0} ataka", - "portLabel": "Port: {0}", "ports": "ports", "programmer": "Programatzailea", "reselectLater": "Hautatu berriz geroago", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Hautatu plaka", "selectPortForInfo": "Hautatu ataka bat plakaren informazioa eskuratzeko.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "{0}:{1} plataforma behar bezala instalatu da", "succesfullyUninstalledPlatform": "{0}:{1} plataforma behar bezala desinstalatu da", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Plaka kudeatzailea", @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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.", @@ -251,7 +250,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", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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": "Configure and Upload", "createdArchive": "'{0}' artxiboa sortu da.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/fa.json b/i18n/fa.json index b0af6dd47..8e5f3f446 100644 --- a/i18n/fa.json +++ b/i18n/fa.json @@ -18,24 +18,21 @@ "configDialog1": "اگر می‌خواهید طرحی را آپلود کنید، هم یک تابلو و هم یک پورت انتخاب کنید.", "configDialog2": "اگر فقط تابلو را انتخاب کنید، می توانید کامپایل کنید، اما نمی توانید طرح خود را آپلود کنید.", "couldNotFindPreviouslySelected": "نمی توان برد انتخاب شده قبلی '{0}' در پلتفرم نصب شده '{1}' را پیدا کرد. لطفاً تابلویی را که می‌خواهید استفاده کنید، مجدداً به‌صورت دستی انتخاب کنید. آیا اکنون می خواهید آن را مجدداً انتخاب کنید؟", - "disconnected": "اتصال قطع شد", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "دریافت راهنمای برد", "inSketchbook": "(در منبع طرح ها)", "installNow": "هسته \"{0}{1}\" باید برای برد \"{2}\" انتخاب شده فعلی نصب شود. آیا الان می خواهید نصبش کنید؟", "noBoardsFound": "هیچ بردی پیدا نشد برای{0}", - "noFQBN": "FQBN برای برد انتخاب شده \"{0}\" موجود نیست. آیا هسته مربوطه را نصب کرده اید؟", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "هیچ پورتی پیدا نشد", - "noPortsSelected": "هیچ پورتی برای برد انتخاب نشده است.{0}", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "هیچ بردی انتخاب نشده است.", "openBoardsConfig": "انتخاب سایر برد ها و پورت ها", "pleasePickBoard": "لطفاً یک برد متصل به پورتی که انتخاب کرده اید را انتخاب کنید.", "port": "پورت {0}", - "portLabel": "پورت: {0}", "ports": "پورت ها", "programmer": "برنامه ریز", "reselectLater": "بعدا انتخاب کنید", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "جستجوی بورد", "selectBoard": "انتخاب برد", "selectPortForInfo": "لطفاً یک پورت را برای به دست آوردن اطلاعات هیئت مدیره انتخاب کنید.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "نصب پلتفرم موفقیت آمیز بود {0}:{1}", "succesfullyUninstalledPlatform": "لغو نصب پلتفرم موفقیت آمیز بود. {0}:{1}", "typeOfPorts": "پورت ها{0}", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "مدیریت برد ها", @@ -215,6 +213,11 @@ "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": "نمی تواند بپرسد." }, @@ -230,10 +233,6 @@ "previousError": "خطای قبلی", "revealError": "فاش کردن خطا" }, - "electron": { - "couldNotSave": "ابر طرح را ذخیره نکرد. لطفا کار ذخیره نشده خود را به ویرایشگر متن مورد علاقه خود کپی کنید، و آردوینو را دوباره راه اندازی کنید.", - "unsavedChanges": "هر تغییری که انجام می دهید ذخیره نمی شود." - }, "examples": { "builtInExamples": "نمونه های داخلی", "couldNotInitializeExamples": "ابر نمی تواند نمونه های داخلی را مقدار دهی اولیه کند.", @@ -251,7 +250,7 @@ "selectBoard": "انتخاب برد", "selectVersion": "انتخاب نسخه درایور", "successfullyInstalled": "نصب درایور موفقیت آمیز بود.", - "updater": "بروزرسان درایور WiFi101 / WiFiNINA" + "updater": "Firmware Updater" }, "help": { "environment": "محیط", @@ -282,6 +281,10 @@ "updateAvailable": "به روز رسانی موجود است", "versionDownloaded": "آردوینو {0} دانلود شده بوده است." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "اضافه کتابخانه ی .zip شده", "arduinoLibraries": "کتابخانه های آردوینو", @@ -381,6 +384,9 @@ "language.log": "اگر سرور زبان آردوینو باید فایل های گزارش را در پوشه طرح ایجاد کند درست می باشد. در غیر این صورت، نادرست است. به طور پیش فرض نادرست است.", "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": "مکان جدید منبع طرح ها را مشخص کنید", "noCliConfig": "Could not load the CLI configuration", @@ -428,7 +434,6 @@ "sketch": { "archiveSketch": "آرشیو طرح", "cantOpen": "پوشه ای با نام \"{0}\" از قبل وجود دارد. طرح را نمی توان باز کرد", - "close": "آیا شما می خواهید این طرح را ببندید؟", "compile": "تدوین طرح...", "configureAndUpload": "پیکری بندی و بارگذاری", "createdArchive": "آرشیو {0} ایجاد شد.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/fil.json b/i18n/fil.json index 8520aa969..821392850 100644 --- a/i18n/fil.json +++ b/i18n/fil.json @@ -18,24 +18,21 @@ "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?", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", "openBoardsConfig": "Select other board and port…", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", - "portLabel": "Port: {0}", "ports": "ports", "programmer": "Programmer", "reselectLater": "Reselect later", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Pumili ng board", "selectPortForInfo": "Please select a port to obtain board info.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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.", @@ -251,7 +250,7 @@ "selectBoard": "Pumili ng board", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/fr.json b/i18n/fr.json index 0ea17712a..8ac0ad762 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -18,24 +18,21 @@ "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": "Edit Board and 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 ?", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "Le FQBN n'est pas disponible pour la carte sélectionnée \"{0}\". Avez installé le cœur correspondant ?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Aucun porte sélectionné pour la carte : '{0}'", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Aucune carte sélectionnée.", "openBoardsConfig": "Sélectionner une autre carte et un autre port ...", "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", "reselectLater": "Re-sélectionner plus tard", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Selectionner une carte", "selectPortForInfo": "Merci de choisir un port pour obtenir des informations sur la carte.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Plateforme installé avec succès {0}:{1}", "succesfullyUninstalledPlatform": "Plateforme désinstallée avec succès {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Gestionnaire de carte", @@ -215,6 +213,11 @@ "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": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, "dialog": { "dontAskAgain": "Ne plus demander." }, @@ -230,10 +233,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.", @@ -251,7 +250,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", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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": "Could not load the CLI configuration", @@ -428,7 +434,6 @@ "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": "Configure and Upload", "createdArchive": "Archive créer '{0}'", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/he.json b/i18n/he.json index 2b727b281..3f8d9d6d3 100644 --- a/i18n/he.json +++ b/i18n/he.json @@ -18,24 +18,21 @@ "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?", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "הFQBN אינו זמין ללוח \"{0}\". האם הותקן הליבה המתאימה?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "לא נמצאו פורטים", - "noPortsSelected": "לא נבחרו פורטים ללוחות '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "לא נבחרו לוחות.", "openBoardsConfig": "בחר לוח ופורט אחר...", "pleasePickBoard": "יש לבחור את הלוח המחובר לפורט הנבחר.", "port": "פורט{0}", - "portLabel": "פורט: {0}", "ports": "ports", "programmer": "תכנת", "reselectLater": "בחר מחדש מאוחר יותר", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "חפש לוח", "selectBoard": "בחר לוח", "selectPortForInfo": "אנא בחר פורט לקבלת מידע אודותיו.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "פלטפורמה הותקנה בהצלחה {0}:{1}", "succesfullyUninstalledPlatform": "פלטפורמה הוסרה בהצלחה {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "מנהל לוחות", @@ -215,6 +213,11 @@ "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": "אל תשאל שוב" }, @@ -230,10 +233,6 @@ "previousError": "שגיאה קודמת.", "revealError": "הראה שגיאה" }, - "electron": { - "couldNotSave": "לא ניתן לשמור את הסקיצה. נא להעתיק את העבודה הלא שמורה לתוך עורך טקסט חיצוני, ולהפעיל מחדש את הIDE.", - "unsavedChanges": "כל השינויים שלא נשמרו לא ישמרו." - }, "examples": { "builtInExamples": "דוגמאות מובנות", "couldNotInitializeExamples": "לא ניתן להפעיל את הדוגמאות מובנות מראש.", @@ -251,7 +250,7 @@ "selectBoard": "בחר לוח", "selectVersion": "בחירות גרסת קושחה", "successfullyInstalled": "הקושחה הותקנה בהצלחה.", - "updater": "לעדכון הקושחה WiFi101 / WiFiNINA " + "updater": "Firmware Updater" }, "help": { "environment": "סביבה", @@ -282,6 +281,10 @@ "updateAvailable": "נמצא עדכון", "versionDownloaded": "Arduino IDE {0} ירד בהצלחה" }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "הוספת ספריית .zip", "arduinoLibraries": "ספריות ארדואינו", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "sketch": { "archiveSketch": "Archive Sketch", "cantOpen": "A folder named \"{0}\" already exists. Can't open sketch.", - "close": "בטוח.ה שתרצה.י לסגור את הסקיצה?", "compile": "מקמפל סקיצה...", "configureAndUpload": "Configure and Upload", "createdArchive": "ארכיון ׳{0}׳ נוצר.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/hi.json b/i18n/hi.json deleted file mode 100644 index 08a47309e..000000000 --- a/i18n/hi.json +++ /dev/null @@ -1,538 +0,0 @@ -{ - "arduino": { - "about": { - "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", - "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", - "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?", - "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", - "ports": "ports", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "searchBoard": "Search board", - "selectBoard": "Select Board", - "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}", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" - }, - "boardsManager": "Boards Manager", - "boardsType": { - "arduinoCertified": "Arduino Certified" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning 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." - }, - "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 '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" - }, - "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", - "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": "Share...", - "shareSketch": "Share Sketch", - "showHideSketchbook": "Show/Hide Cloud 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." - }, - "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", - "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", - "selectedOn": "on {0}", - "serialMonitor": "Serial Monitor", - "type": "Type", - "unknown": "Unknown", - "updateable": "Updatable" - }, - "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": "Remove", - "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}'", - "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?" - }, - "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" - }, - "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": { - "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." - }, - "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "include": "Include Library", - "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?", - "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 {0}:{1} needs some other dependencies currently not installed:", - "needsOneDependency": "The library {0}:{1} 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.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", - "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.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": { - "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.", - "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.", - "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", - "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" - }, - "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" - }, - "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." - }, - "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": "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" - }, - "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/hu.json b/i18n/hu.json index ab78b060a..9c1b919fb 100644 --- a/i18n/hu.json +++ b/i18n/hu.json @@ -18,24 +18,21 @@ "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": "Leválasztott", + "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? ", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "Az FQBN nem érhető el a kiválasztott „{0}” alaplapon. A megfelelő mag/core telepítve van? ", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "Nincs észlelt port", - "noPortsSelected": "Nincsen port kiválasztva a alaplaphoz: '{0}'. ", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Nincs alaplap kiválasztva", "openBoardsConfig": "Válassz másik alaplapot és portot… ", "pleasePickBoard": "Válassz alaplapot, amely a kiválasztott porthoz csatlakozik. ", "port": "Port {0}", - "portLabel": "Port: {0}", "ports": "ports", "programmer": "Programozó", "reselectLater": "Később újra válaszd ki", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Alaplap választás", "selectPortForInfo": "Válassz egy portot az alaplap információinak megtekintéséhez. ", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Sikeresen telepített platform {0}:{1}", "succesfullyUninstalledPlatform": "A platform sikeresen eltávolítva: {0}:{1} ", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Alaplap-kezelő", @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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. ", @@ -251,7 +250,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", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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": "Configure and Upload", "createdArchive": "Archívum létrehozva: {0}. ", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, 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 {0}:{1} needs some other dependencies currently not installed:", - "needsOneDependency": "The library {0}:{1} 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 index 08a47309e..7f261e9bf 100644 --- a/i18n/id.json +++ b/i18n/id.json @@ -1,83 +1,81 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", - "label": "About {0}" + "detail": "Versi:{0}\nTanggal:{1}{2}\nVersi CLI{3}\n\n{4}", + "label": "Tentang {0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", - "goToIoTCloud": "Go to IoT Cloud", - "goToProfile": "Go to Profile", + "goToCloudEditor": "Buka Cloud Editor", + "goToIoTCloud": "Buka IoT Cloud", + "goToProfile": "Buka Profil", "menuTitle": "Arduino Cloud" }, "board": { - "board": "Board{0}", - "boardConfigDialogTitle": "Select Other Board and Port", - "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.", + "board": "Papan{0}", + "boardConfigDialogTitle": "Pilih Papan dan Port Lain", + "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?", - "disconnected": "Disconnected", - "getBoardInfo": "Get Board Info", - "inSketchbook": " (in Sketchbook)", + "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": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", + "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}", - "portLabel": "Port: {0}", - "ports": "ports", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "searchBoard": "Search board", - "selectBoard": "Select Board", - "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}", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" - }, - "boardsManager": "Boards Manager", + "ports": "port", + "programmer": "Pemrogram", + "reselectLater": "Pilih ulang nanti", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "Cari papan", + "selectBoard": "Pilih Papan", + "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": "Arduino Certified" + "arduinoCertified": "Tersertifikasi Arduino" }, "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning bootloader...", - "doneBurningBootloader": "Done burning bootloader." + "burnBootloader": "Bakar Bootloader", + "burningBootloader": "Membakar bootloader...", + "doneBurningBootloader": "Pembakaran Bootloader Selesai." }, "burnBootloader": { - "error": "Error while burning the bootloader: {0}" + "error": "Eror saat membakar 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." + "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": "Check for Arduino Updates", - "installAll": "Install All", + "checkForUpdates": "Periksa Pembaruan Arduino", + "installAll": "Pasang Semua", "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.", @@ -96,7 +94,7 @@ "donePulling": "Done pulling '{0}'.", "donePushing": "Done pushing '{0}'.", "embed": "Embed:", - "emptySketchbook": "Your Sketchbook is empty", + "emptySketchbook": "Buku Sketsa anda kosong", "goToCloud": "Go to Cloud", "learnMore": "Learn more", "link": "Link:", @@ -115,20 +113,20 @@ "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", + "share": "Membagikan...", + "shareSketch": "Bagikan Sketsa", "showHideSketchbook": "Show/Hide Cloud Sketchbook", - "signIn": "SIGN IN", - "signInToCloud": "Sign in to Arduino Cloud", + "signIn": "MASUK", + "signInToCloud": "Masuk ke Arduino Cloud", "signOut": "Sign Out", - "sync": "Sync", - "syncEditSketches": "Sync and edit your Arduino Cloud Sketches", - "visitArduinoCloud": "Visit Arduino Cloud to create Cloud Sketches." + "sync": "Sinkron", + "syncEditSketches": "Sinkron dan edit Sketsa Arduino Cloud anda", + "visitArduinoCloud": "Kunjungi Arduino Cloud untuk membuat Sketsa Cloud" }, "cloudSketch": { - "alreadyExists": "Cloud sketch '{0}' already exists.", - "creating": "Creating cloud sketch '{0}'...", - "new": "New Cloud Sketch", + "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}'...", @@ -168,7 +166,7 @@ "installed": "{0} installed", "moreInfo": "More info", "otherVersions": "Other Versions", - "remove": "Remove", + "remove": "Hapus", "title": "{0} by {1}", "uninstall": "Uninstall", "uninstallMsg": "Do you want to uninstall {0}?", @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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.", @@ -248,10 +247,10 @@ "install": "Install", "installingFirmware": "Installing firmware.", "overwriteSketch": "Installation will overwrite the Sketch on the board.", - "selectBoard": "Select Board", + "selectBoard": "Pilih Papan", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -282,12 +281,16 @@ "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": "Install All", + "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?", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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}'.", @@ -458,7 +463,7 @@ "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", - "upload": "Upload", + "upload": "Unggah", "uploadUsingProgrammer": "Upload Using Programmer", "uploading": "Uploading...", "userFieldsNotFoundError": "Can't find user fields for connected board", @@ -466,7 +471,7 @@ "verifyOrCompile": "Verify/Compile" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", + "newCloudSketch": "Sketsa Cloud Baru", "newSketch": "New Sketch" }, "survey": { @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, @@ -496,7 +502,7 @@ "userFields": { "cancel": "Cancel", "enterField": "Enter {0}", - "upload": "Upload" + "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.", diff --git a/i18n/it.json b/i18n/it.json index 535028fb9..9f85f8d03 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -18,24 +18,21 @@ "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?", "noBoardsFound": "Nessuna scheda trovata per \"{0}\"", - "noFQBN": "La FQBN non è disponibile per la scheda selezionata\"{0}\". Sei sicuro che il core specifico sia stato installato?", "noNativeSerialPort": "Porta seriale nativa, non è possibile ottenere informazioni.", "noPortsDiscovered": "Nessuna porta rilevata", - "noPortsSelected": "Nessuna porta selezionata per la scheda: '{0}'.", "nonSerialPort": "Porta non seriale, non è possibile ottenere informazioni.", - "noneSelected": "Nessuna scheda selezionata.", "openBoardsConfig": "Scegli un'altra scheda e un altra porta...", "pleasePickBoard": "Scegli la scheda collegata alla porta che hai selezionato.", "port": "Porta{0}", - "portLabel": "Porta: {0}", "ports": "porte", "programmer": "Programmatore", "reselectLater": "Riselezionare più tardi", + "revertBoardsConfig": "Usa '{0}' rilevato su '{1}'", "searchBoard": "Cerca la scheda", "selectBoard": "Seleziona la scheda", "selectPortForInfo": "Selezionare la porta per ottenere info sulla scheda.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Piattaforma installata correttamente {0}:{1}", "succesfullyUninstalledPlatform": "Piattaforma disinstallata correttamente {0}:{1}", "typeOfPorts": "{0} porte", + "unconfirmedBoard": "Scheda non confermata", "unknownBoard": "Scheda sconosciuta" }, "boardsManager": "Gestore schede", @@ -215,6 +213,11 @@ "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ù" }, @@ -230,10 +233,6 @@ "previousError": "Errore Precedente", "revealError": "Rileva l'errore" }, - "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." - }, "examples": { "builtInExamples": "Esempi integrati", "couldNotInitializeExamples": "Impossibile inizializzare gli esempi incorporati.", @@ -251,7 +250,7 @@ "selectBoard": "Seleziona la scheda", "selectVersion": "Selezione la versione del firmware", "successfullyInstalled": "Firmware correttamente installato.", - "updater": "WiFi101 / WiFiNINA Aggiornamento Firmware" + "updater": "Aggiornamento del firmware" }, "help": { "environment": "Ambiente di sviluppo", @@ -282,6 +281,10 @@ "updateAvailable": "Aggiornamento disponibile", "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", @@ -294,7 +297,7 @@ "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 {0}:{1} necessita altre dipendenze che attualmente non sono installate:", "needsOneDependency": "La libreria {0}:{1} necessita di dipendenze che attualmente non sono installate:", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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": "Configura e Carica", "createdArchive": "Creato l'archivio '{0}'.", @@ -478,8 +483,9 @@ "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": "Alto contrasto", - "light": "Luce", + "hc": "Scuro ad alto contrasto", + "hcLight": "Chiaro ad alto contrasto", + "light": "Chiaro", "user": "{0} (utente)" }, "title": { diff --git a/i18n/ja.json b/i18n/ja.json index 857e377d8..c0611ea31 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -18,24 +18,21 @@ "configDialog1": "スケッチを書き込みたい場合には、ボードとポートの両方を選択してください。", "configDialog2": "ボードのみを選択した場合、コンパイルはできますが、スケッチの書き込みはできません。", "couldNotFindPreviouslySelected": "インストールされているプラットフォーム'{1}'で、以前に選択したボード'{0}'が見つかりませんでした。使用したいボードを手動で選択し直してください。今すぐ選択し直しますか?", - "disconnected": "切断中", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "ボード情報を取得", "inSketchbook": "(スケッチブック内)", "installNow": "現在選択されているボード\"{2}\"用にコア\"{0} {1}\"をインストールする必要があります。今すぐインストールしますか?", "noBoardsFound": "\"{0}\"のボードが見つかりませんでした", - "noFQBN": "選択されたボード\"{0}\"にはFQBNがありません。対応するコアをインストール済みですか?", "noNativeSerialPort": "ネイティブのシリアルポートで、情報を取得できません。", "noPortsDiscovered": "ポートが見つかりませんでした", - "noPortsSelected": "ボード用に選択されたポートがありません: '{0}'.", "nonSerialPort": "シリアルポートではないため、情報を取得できません。", - "noneSelected": "ボード未選択です。", "openBoardsConfig": "他のボードとポートを選択…", "pleasePickBoard": "選択したポートに接続されているボードを選んでください。", "port": "ポート{0}", - "portLabel": "ポート: {0}", "ports": "ポート", "programmer": "書き込み装置", "reselectLater": "後で選択しなおす", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "ボードを検索", "selectBoard": "ボードを選択", "selectPortForInfo": "ボード情報を得るには、ポートを選択してください。", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "プラットフォーム{0}:{1}のインストールに成功しました", "succesfullyUninstalledPlatform": "プラットフォーム{0}:{1}のアンインストールに成功しました", "typeOfPorts": "{0}ポート", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "未知のボード" }, "boardsManager": "ボードマネージャ", @@ -215,6 +213,11 @@ "optimizeForDebugging": "デバッグに最適化", "sketchIsNotCompiled": "デバッグセッションを開始する前に、スケッチ'{0}'を検証する必要があります。スケッチを検証してから、もう一度デバッグを開始してください。今すぐスケッチを検証しますか?" }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, "dialog": { "dontAskAgain": "次回から表示しない" }, @@ -230,10 +233,6 @@ "previousError": "前のエラー", "revealError": "エラーを表示" }, - "electron": { - "couldNotSave": "スケッチを保存できませんでした。保存されていない作業内容を好きなテキストエディターにコピーして、IDEを再起動してください。", - "unsavedChanges": "未保存の変更は保存されません。" - }, "examples": { "builtInExamples": "付属のスケッチ例", "couldNotInitializeExamples": "付属のスケッチ例を初期化できませんでした。", @@ -251,7 +250,7 @@ "selectBoard": "ボードを選択", "selectVersion": "ファームウェアのバージョンを選択", "successfullyInstalled": "ファームウェアのインストールに成功しました。", - "updater": "WiFi101 / WiFiNINAファームウェア・アップデータ" + "updater": "Firmware Updater" }, "help": { "environment": "環境", @@ -282,6 +281,10 @@ "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ライブラリ", @@ -381,6 +384,9 @@ "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の設定を読み込めませんでした", @@ -428,7 +434,6 @@ "sketch": { "archiveSketch": "スケッチをアーカイブする", "cantOpen": "「{0}」というフォルダはすでに存在します。スケッチを開けません。", - "close": "本当にスケッチを閉じますか?", "compile": "スケッチをコンパイル中…", "configureAndUpload": "構成と書き込み", "createdArchive": "アーカイブ'{0}'を作成しました。", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/ko.json b/i18n/ko.json index 7ed1df8ac..d2f856582 100644 --- a/i18n/ko.json +++ b/i18n/ko.json @@ -18,25 +18,22 @@ "configDialog1": "스케치를 업로드할 보드 및 포트를 선택", "configDialog2": "보드를 선택하면 컴파일은 가능하지만, 스케치를 업로드 할 수 없습니다.", "couldNotFindPreviouslySelected": "선택된 보드를 찾을 수 없습니다. '{0}' 설치된 플랫폼에서'{1}'. 수동으로 사용 할 보드를 선택해주세요.\n지금 보드를 다시 선택하시겠습니까?", - "disconnected": "연결해제됨", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "보드정보 얻기", "inSketchbook": "(스케치북에서)", "installNow": "\"{0} {1}\"버전은 최근에 선택된 \"{2}\"보드를 설치해야 합니다. 지금 설치하시겠습니까?", "noBoardsFound": "\"{0}\"에 대한 보드를 찾을 수 없습니다.", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "포트를 찾을 수 없습니다.", - "noPortsSelected": "보드에 맞는 포트가 없습니다: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "보드가 선택되지 않았습니다.", "openBoardsConfig": "보드 및 포트를 선택하세요.", "pleasePickBoard": "선택한 포트에 연결할 보드를 선택하십시오", "port": "포트{0}", - "portLabel": "포트: {0}", "ports": "ports", "programmer": "프로그래머", "reselectLater": "나중에 선택", - "searchBoard": "보드찾기", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "보드 검색", "selectBoard": "보드 선택", "selectPortForInfo": "보드 정보를 얻으려면 포트를 선택하십시오.", "showAllAvailablePorts": "활성화된 사용 가능한 모든 포트를 표시합니다.", @@ -44,7 +41,8 @@ "succesfullyInstalledPlatform": "성공적으로 설치된 플랫폼{0}:{1}", "succesfullyUninstalledPlatform": "성공적으로 설치된 플랫폼 {0}:{1}", "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "알 수 없는 보드" }, "boardsManager": "보드매니저", "boardsType": { @@ -98,7 +96,7 @@ "embed": "Embed:", "emptySketchbook": "스케치북이 비어 있습니다.", "goToCloud": "Go to Cloud", - "learnMore": "더 배우기", + "learnMore": "더 알아보기", "link": "링크:", "notYetPulled": "클라우드에 push 할수 없습니다. 아직 pull 되지 않았습니다.", "offline": "오프라인", @@ -138,7 +136,7 @@ "common": { "all": "전체", "contributed": "공헌된", - "installManually": "수동설치", + "installManually": "수동으로 설치", "later": "나중에", "noBoardSelected": "선택된 보드 없음", "notConnected": "[연결되지 않음]", @@ -152,7 +150,7 @@ "serialMonitor": "시리얼 모니터", "type": "Type", "unknown": "알 수 없음", - "updateable": "업데이트가능함" + "updateable": "업데이트 가능함" }, "compile": { "error": "컴파일 오류: {0}" @@ -164,8 +162,8 @@ "filterSearch": "필터 검색...", "install": "설치", "installLatest": "Install Latest", - "installVersion": "Install {0}", - "installed": "{0} installed", + "installVersion": "{0} 설치", + "installed": "{0} 설치됨", "moreInfo": "더 많은 정보", "otherVersions": "Other Versions", "remove": "제거", @@ -215,6 +213,11 @@ "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": "다시 묻지 않음" }, @@ -230,10 +233,6 @@ "previousError": "이전 에러", "revealError": "에러 표시" }, - "electron": { - "couldNotSave": "스케치를 저장할 수 없습니다. 저장하지 않은 작업을 즐겨 사용하는 텍스트 편집기에 복사하고 IDE를 다시 시작하세요.", - "unsavedChanges": "저장되지 않은 변경 사항은 저장되지 않습니다." - }, "examples": { "builtInExamples": "포함된 예제들", "couldNotInitializeExamples": "내장된 예제를 초기화 할 수 없습니다.", @@ -251,7 +250,7 @@ "selectBoard": "보드 선택", "selectVersion": "펌웨어 버전 선택", "successfullyInstalled": "펌웨어가 성공적으로 설치되었습니다.", - "updater": "WiFi101 / WiFiNINA 펌웨어 업데이터" + "updater": "Firmware Updater" }, "help": { "environment": "환경", @@ -282,6 +281,10 @@ "updateAvailable": "업데이트 사용 가능", "versionDownloaded": "Arduino IDE {0} 버전이 다운로드 되었습니다. " }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": ".ZIP 라이브러리 추가...", "arduinoLibraries": "아두이노 라이브러리", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "sketch": { "archiveSketch": "스케치 압축저장", "cantOpen": "이름이 \"{0}\" 인 폴더가 이미 존재합니다. 스케치를 열 수 없습니다.", - "close": "스케치를 닫으시겠습니까?", "compile": "스케치 컴파일중...", "configureAndUpload": "Configure and Upload", "createdArchive": "Created archive '{0}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, @@ -504,7 +510,7 @@ "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" + "renameSketchFolderTitle": "유효하지 않은 스케치 이름" }, "workspace": { "alreadyExists": "'{0}' already exists." diff --git a/i18n/my.json b/i18n/my.json deleted file mode 100644 index 19a3645e0..000000000 --- a/i18n/my.json +++ /dev/null @@ -1,380 +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", - "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.", - "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.", - "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." - }, - "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" - }, - "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." - }, - "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" - }, - "coreContribution": { - "copyError": "Copy error messages" - }, - "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" - }, - "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", - "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." - }, - "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": { - "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." - }, - "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 {0}:{1} needs some other dependencies currently not installed:", - "needsOneDependency": "The library {0}:{1} 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": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" - }, - "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" - }, - "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", - "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", - "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" - }, - "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", - "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" - }, - "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." - }, - "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" - } - } -} diff --git a/i18n/my_MM.json b/i18n/my_MM.json index 4556ad438..08b058070 100644 --- a/i18n/my_MM.json +++ b/i18n/my_MM.json @@ -18,24 +18,21 @@ "configDialog1": "ကုတ်ဖိုင်တစ်ခုကို upload တင်လိုပါက ဘုတ်နှင့်အပေါက် နှစ်ခုလုံးကို ရွေးပေးပါ။", "configDialog2": "သင် ဘုတ်တစ်ခုထဲကိုသာ ရွေးချယ်ထားပါက compile ပြုလုပ်နိုင်သော်လည်း ကုဒ်ဖိုင်ကိုတော့ upload မတင်နိုင်ပါ။", "couldNotFindPreviouslySelected": "တပ်ဆင်ထားသည့် ပလက်ဖောင်း '{1}' ထဲမှာ ယခင်ရွေးချယ်ထားသည့်ဘုတ် '{0}' ကို ရှာမတွေ့ပါ။ ကျေးဇူးပြု၍ မိမိအသုံးပြုလိုသည့် ဘုတ်ကို မိမိကိုယ်တိုင် ပြန်လည်ရွေးချယ်ပေးပါ။ သင်အခု ပြန်လည်ရွေးချယ် လိုပါသလား?", - "disconnected": "မချိတ်ဆက်ထားပါ", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "ဘုတ်ဆိုင်ရာအချက်အလက်ရယူမည်", "inSketchbook": " (Sketchbook ဖိုင်တွဲထဲ)", "installNow": "လက်ရှိရွေးချယ်ထားသည့် \"{2}\" ဘုတ်အတွက် \"{0} {1}\" core အား တပ်ဆင်ဖို့လိုပါသည်။ သင်ယခု တပ်ဆင်လိုပါသလား?", "noBoardsFound": "\"{0}\"အတွက် ဘုတ်ရှာမတွေ့ပါ", - "noFQBN": "ရွေးချယ်ထားသည့် ဘုတ် \"{0}\" အတွက် FQBN မရနိုင်သေးပါ။ သင့်မှာ သက်ဆိုင်ရာတပ်ဆင်ထားသည့် core ရှိပါသလား?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "မည်သည့်အပေါက်မှမတွေ့ပါ", - "noPortsSelected": "'{0}' ဘုတ် အတွက် မည်သည့်အပေါက်မှ မရွေးချယ်ထားပါ။", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "ဘုတ်မရွေးချယ်ထားပါ။", "openBoardsConfig": "အခြားဘုတ်နှင့်အပေါက်ကို ရွေးချယ်ရန်...", "pleasePickBoard": "သင်ရွေးချယ်ထားသော အပေါက်နှင့် ချိတ်ဆက်ထားသည့် ဘုတ်ကို ကျေးဇူးပြု၍ ရွေးပေးပါ။", "port": "အပေါက်{0}", - "portLabel": "အပေါက် - {0}", "ports": "အပေါက်များ", "programmer": "ပရိုဂရမ်မာ", "reselectLater": "နောက်မှ ပြန်ရွေးချယ်မည်", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "ဘုတ်ရှာမည်", "selectBoard": "ဘုတ်ရွေးချယ်မည်", "selectPortForInfo": "လျှပ်စစ်ဘုတ်ဆိုင်ရာအချက်အလက်ရရှိရန် အပေါက်ကို ရွေးချယ်ပါ။", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ တပ်ဆင်ပြီးသည် :{1}", "succesfullyUninstalledPlatform": "{0} ပလက်ဖောင်းကို အောင်မြင်စွာ ဖြုတ်ချပြီးသည် :{1}", "typeOfPorts": "{0} အပေါက်များ", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "ဘုတ်မန်နေဂျာ", @@ -215,6 +213,11 @@ "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": "နောက်ထပ်မမေးပါနှင့်" }, @@ -230,10 +233,6 @@ "previousError": "ရှေ့ကအမှား", "revealError": "အမှားဖော်ပြ" }, - "electron": { - "couldNotSave": "ကုတ်ပုံကြမ်းကို မသိမ်းဆည်းနိုင်ခဲ့ပါ။ ကျေးဇူးပြု၍ သင်၏ မသိမ်းဆည်းရသေးသော ကုတ်များကို သင်နှစ်သက်ရာ စာသားတည်းဖြတ်မှုဆော့ဖ်ဝဲထဲသို့ ကူးယူပြီး IDE ကို ပြန်စတင်ပါ။", - "unsavedChanges": "မသိမ်းရသေးသောပြောင်းလဲမှုများကိုသိမ်းမည်မဟုတ်ပါ။" - }, "examples": { "builtInExamples": "နဂိုပါဝင်သောဥပမာများ", "couldNotInitializeExamples": "နဂိုပါဝင်သောဥပမာများကို မစတင်နိုင်ခဲ့ပါ။", @@ -251,7 +250,7 @@ "selectBoard": "ဘုတ်ရွေးချယ်မည်", "selectVersion": "ဖမ်းဝဲလ်ဗားရှင်း ရွေးပါ", "successfullyInstalled": "ဖမ်းဝဲလ်ကို အောင်မြင်စွာ သွင်းပြီးပါပြီ။", - "updater": "WiFi101 / WiFiNINA ဖမ်းဝဲလ်မြှင့်ပေးသူ" + "updater": "Firmware Updater" }, "help": { "environment": "ဆော့ဖ်ဝဲလ်အကြောင်း", @@ -282,6 +281,10 @@ "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ကုတ်ကြည့်တိုက်များ", @@ -381,6 +384,9 @@ "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": "ကုတ်ဖိုင်လ်စာအုပ်တည်နေရာအသစ်ရွေးမည်", "noCliConfig": "Could not load the CLI configuration", @@ -428,7 +434,6 @@ "sketch": { "archiveSketch": "ကုတ်ဖိုင်လ်သိမ်းမည်", "cantOpen": "\"{0}\" အမည်ဖြင့်ဖိုလ်ဒါရှိနှင့်ပြီးဖြစ်သည်။ ကုတ်ဖိုင်လ်ကို မဖွင့်နိုင်ပါ။", - "close": "ကုတ်ဖိုင်လ်ပိတ်မှာသေချာပါသလား။", "compile": "ကုတ်ဖိုင်လ်ကို ကုတ်ပေါင်းနေသည်…", "configureAndUpload": "ပြင်ဆင်၍အပ်လုတ်တင်မည်", "createdArchive": "ဖန်းတီးပြီးသော သိမ်းဆည်းဖိုင်လ် '{0}'။", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/ne.json b/i18n/ne.json index 3788879f2..9b8856501 100644 --- a/i18n/ne.json +++ b/i18n/ne.json @@ -5,37 +5,34 @@ "label": "About {0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", - "goToIoTCloud": "Go to IoT Cloud", - "goToProfile": "Go to Profile", - "menuTitle": "Arduino Cloud" + "goToCloudEditor": "क्लाउड सम्पादकमा जानुहोस् |", + "goToIoTCloud": "IoT क्लाउडमा जानुहोस् । ", + "goToProfile": "प्रोफाइल मा जानुहोस् ।", + "menuTitle": "आर्डुइनो क्लाउड्" }, "board": { - "board": "Board{0}", - "boardConfigDialogTitle": "Select Other Board and Port", - "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", - "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?", - "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", + "board": "बोर्ड {0}", + "boardConfigDialogTitle": "अन्य बोर्ड र पोर्ट चयन गर्नुहोस् |", + "boardInfo": "बोर्डको जानकारी", + "boards": "बोर्डहरू", + "configDialog1": "यदि तपाइँ स्केच अपलोड गर्न चाहनुहुन्छ भने बोर्ड र पोर्ट दुवै चयन गर्नुहोस्।", + "configDialog2": "यदि तपाइँ केवल बोर्ड चयन गर्नुहुन्छ भने तपाइँ कम्पाइल गर्न सक्षम हुनुहुनेछ, तर तपाइँको स्केच अपलोड गर्न सक्नुहुन्न।", + "couldNotFindPreviouslySelected": "स्थापित प्लेटफर्म '{1}' मा पहिले चयन गरिएको बोर्ड '{0}' फेला पार्न सकिएन​। कृपया तपाईंले प्रयोग गर्न चाहनुभएको बोर्डलाई म्यानुअल रूपमा पुन: चयन गर्नुहोस्। के तपाइँ यसलाई अहिले पुन: चयन गर्न चाहनुहुन्छ?", + "editBoardsConfig": "बोर्ड र पोर्ट परिमार्जन गर्नुहोस्...", + "getBoardInfo": "बोर्डको बारेमा जानकारी प्राप्त गर्नुहोस्।", + "inSketchbook": "(स्केचबुकमा)", + "installNow": "हाल चयन गरिएको \"{2}\" बोर्डको लागि \"{0} {1}\" core स्थापना गर्नुपर्छ। के तपाइँ यसलाई अहिले स्थापना गर्न चाहनुहुन्छ?", + "noBoardsFound": "\"{0}\" को लागि कुनै बोर्ड फेला परेन।", + "noNativeSerialPort": "Native serial port, जानकारी प्राप्त गर्न सक्दैन। ", + "noPortsDiscovered": "कुनै पोर्टहरू फेला परेन।", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", "openBoardsConfig": "Select other board and port…", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Port{0}", - "portLabel": "Port: {0}", "ports": "ports", "programmer": "Programmer", "reselectLater": "Reselect later", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Select Board", "selectPortForInfo": "Please select a port to obtain board info.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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.", @@ -251,7 +250,7 @@ "selectBoard": "Select Board", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/nl.json b/i18n/nl.json index a369e991a..3a3e91c7b 100644 --- a/i18n/nl.json +++ b/i18n/nl.json @@ -18,24 +18,21 @@ "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": "Losgekoppeld", + "editBoardsConfig": "Edit Board and Port...", "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?", "noBoardsFound": "Geen borden gevonden voor \"{0}\"", - "noFQBN": "De FQBN is niet beschikbaar voor het geselecteerde bord \"{0}\". Heeft U de bijhorende kern geïnstalleerd?", "noNativeSerialPort": "Oorpronkelijke seriële poort, ik kan geen info verkrijgen", "noPortsDiscovered": "Geen poorten gevonden", - "noPortsSelected": "Geen poorten geselecteerd voor bord: '{0}'.", "nonSerialPort": "Dit is geen seriële poort, ik kan geen info verkrijgen", - "noneSelected": "Geen borden geselecteerd.", "openBoardsConfig": "Selecteer een ander bord en poort...", "pleasePickBoard": "Gelieve een bord te selecteren dat verbonden is met de door U gekozen poort.", "port": "Poort{0}", - "portLabel": "Poort: {0}", "ports": "poorten", "programmer": "Programmeerapparaat", "reselectLater": "Later opnieuw selecteren", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Bord zoeken", "selectBoard": "Selecteer Bord", "selectPortForInfo": "Selecteer een poort om bord informatie te bekomen.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Platform {0}:{1} succesvol geïnstalleerd", "succesfullyUninstalledPlatform": "Platform {0}:{1} is succesvol verwijderd", "typeOfPorts": "\"{0}\" poorten", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Onbekend bord" }, "boardsManager": "Borden Beheerder", @@ -215,6 +213,11 @@ "optimizeForDebugging": "Optimaliseren voor foutopsporing", "sketchIsNotCompiled": "Schets '{0}' moet geverifieerd worden voordag de foutopsporing kan beginnen. Verifieer aub de schets opnieuw en start foutopsporing opnieuw. Wil je de schets opnieuw verifiëren?" }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, "dialog": { "dontAskAgain": "Niet meer vragen" }, @@ -230,10 +233,6 @@ "previousError": "Vorige Fout", "revealError": "Onthul fout" }, - "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." - }, "examples": { "builtInExamples": "Ingebouwde voorbeelden", "couldNotInitializeExamples": "Kan ingebouwde voorbeelden niet initialiseren.", @@ -251,7 +250,7 @@ "selectBoard": "Selecteer Bord", "selectVersion": "Selecteer firmware versie", "successfullyInstalled": "Firmware succesvol geïnstalleerd.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Omgeving", @@ -282,6 +281,10 @@ "updateAvailable": "Update beschikbaar", "versionDownloaded": "Arduino IDE {0} is gedownload." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": ".ZIP-bibliotheek toevoegen...", "arduinoLibraries": "Arduino Bibliotheken", @@ -381,6 +384,9 @@ "language.log": "Waar als de Arduino Taal Server log bestanden moet genereren in de schets map. Anders onwaar. Standaard ingesteld op onwaar.", "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", @@ -428,7 +434,6 @@ "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": "Sketch compileren...", "configureAndUpload": "Configureer en upload", "createdArchive": "Archief '{0}' gemaakt.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, 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 {0}:{1} needs some other dependencies currently not installed:", - "needsOneDependency": "The library {0}:{1} 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 b8eba6602..d6b00270e 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -18,24 +18,21 @@ "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": "Edit Board and Port...", "getBoardInfo": "Pobierz informacje o płytce", "inSketchbook": "(w Szkicowniku)", "installNow": "Jądro \"{0} {1}\" musi zostać zainstalowane dla wybranej płytki \"{2}\". Czy chcesz zainstalować je teraz?", "noBoardsFound": "Brak Znalezionych Płytek \"{0}\"", - "noFQBN": "FQBN jest niedostępny dla wybranej płytki \"{0}\". Sprawdź czy zainstalowane jądro jest prawidłowe.", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "Nie wykryto portów", - "noPortsSelected": "Nie wybrano portu dla płytki: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Nie wybrano płytki.", "openBoardsConfig": "Wybierz inną płytkę i port...", "pleasePickBoard": "Wybierz płytkę podłączoną do wybranego portu.", "port": "Port{0}", - "portLabel": "Port: {0}", "ports": "Porty", "programmer": "Programator", "reselectLater": "Wybierz ponownie później", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Szukaj płytki", "selectBoard": "Wybierz płytkę", "selectPortForInfo": "Wybierz port, aby uzyskać informacje o płytce.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Pomyślnie zainstalowano platformę {0}:{1}", "succesfullyUninstalledPlatform": "Pomyślnie odinstalowano platformę {0}:{1}", "typeOfPorts": "{0} Porty", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Menedżer Płytek", @@ -215,6 +213,11 @@ "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": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, "dialog": { "dontAskAgain": "Nie pytaj ponownie" }, @@ -230,10 +233,6 @@ "previousError": "Poprzedni Błąd", "revealError": "Pokaż Error" }, - "electron": { - "couldNotSave": "Wszystkie niezapisane zmiany zostaną utracone.", - "unsavedChanges": "Wszystkie niezapisane zmiany zostaną utracone." - }, "examples": { "builtInExamples": "Wbudowane przykłady", "couldNotInitializeExamples": "Nie można zainicjalizować wbudowanych przykładów.", @@ -251,7 +250,7 @@ "selectBoard": "Wybierz płytkę", "selectVersion": "Wybierz wersję firmware'u", "successfullyInstalled": "Firmware zainstalowany prawidłowo.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Środowisko", @@ -282,6 +281,10 @@ "updateAvailable": "Dostępna aktualizacja.", "versionDownloaded": "Pobrano Arduino IDE {0}" }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "Dodaj bibliotekę .ZIP...", "arduinoLibraries": "Biblioteki Arduino", @@ -381,6 +384,9 @@ "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": "Could not load the CLI configuration", @@ -428,7 +434,6 @@ "sketch": { "archiveSketch": "Archiwizuj szkic", "cantOpen": "Folder \"{0}\" już istnieje. Nie można otworzyć szkicu.", - "close": "Jesteś pewien, że chcesz zamknąć szkic?", "compile": "Kompilowanie szkicu...", "configureAndUpload": "Skompiluj i wgraj", "createdArchive": "Stwórz archiwum '{0}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/pt.json b/i18n/pt.json index a175c9adc..28e463a9a 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -18,24 +18,21 @@ "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 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": "Edit Board and Port...", "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?", "noBoardsFound": "Nenhuma placa encontrada para \"{0}\"", - "noFQBN": "O FQBN não está disponível para a placa selecionada \"{0}\". Você tem o núcleo correspondente instalado?", "noNativeSerialPort": "Porta serial nativa, não é possível obter informações.", "noPortsDiscovered": "Nenhuma porta detectada", - "noPortsSelected": "Nenhuma porta selecionada para placa: '{0}'.", "nonSerialPort": "Porta não-serial, não é possível obter informações.", - "noneSelected": "Nenhuma placa selecionada.", "openBoardsConfig": "Selecione outra placa e porta...", "pleasePickBoard": "Escolha uma placa conectada à porta que você selecionou.", "port": "Porta{0}", - "portLabel": "Porta{0}", "ports": "portas", "programmer": "Programador/Gravador", "reselectLater": "Selecionar novamente mais tarde", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Procurar placa", "selectBoard": "Selecionar Placa", "selectPortForInfo": "Selecione uma porta para obter informações sobre a placa.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Plataforma instalada com sucesso {0}: {1}", "succesfullyUninstalledPlatform": "Plataforma desinstalada com sucesso {0}: {1}", "typeOfPorts": "{0} portas", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Placa desconhecida" }, "boardsManager": "Gerenciador de Placas", @@ -215,6 +213,11 @@ "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": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, "dialog": { "dontAskAgain": "Não perguntar novamente" }, @@ -230,10 +233,6 @@ "previousError": "Erro Anterior", "revealError": "Mostrar Erro" }, - "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." - }, "examples": { "builtInExamples": "Exemplos Integrados", "couldNotInitializeExamples": "Não foi possível inicializar os exemplos integrados.", @@ -251,7 +250,7 @@ "selectBoard": "Selecionar Placa", "selectVersion": "Selecione a versão do firmware", "successfullyInstalled": "Firmware instalado com sucesso. ", - "updater": "Atualizador de Firmware WiFi101 / WiFiNINA" + "updater": "Firmware Updater" }, "help": { "environment": "Ambiente", @@ -282,6 +281,10 @@ "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", @@ -328,13 +331,13 @@ "tools": "Ferramentas" }, "monitor": { - "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", + "alreadyConnectedError": "Não foi possível se conectar à porta {0} {1}. Já conectado.", "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.", + "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" }, @@ -381,6 +384,9 @@ "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 nova localização para o Caderno de Esboços", "noCliConfig": "Não foi possível carregar a configuração CLI", @@ -415,7 +421,7 @@ "serial": { "autoscroll": "Avanço automático de linha", "carriageReturn": "Retorno de linha", - "connecting": "Connecting to '{0}' on '{1}'...", + "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", @@ -428,7 +434,6 @@ "sketch": { "archiveSketch": "Arquivar Esboço", "cantOpen": "Um diretório chamado de \"{0}\" já existe. Não é possível abrir o esboço.", - "close": "Você tem certeza de que você quer fechar esse esboço?", "compile": "Compilando esboço...", "configureAndUpload": "Configurar e fazer Envio", "createdArchive": "Arquivo criado '{0}'.", @@ -475,12 +480,13 @@ "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." }, "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": "High Contrast", - "light": "Light", - "user": "{0} (user)" + "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" diff --git a/i18n/ro.json b/i18n/ro.json index fc74bc520..629f9aa9b 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -18,24 +18,21 @@ "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?", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", "openBoardsConfig": "Select other board and port…", "pleasePickBoard": "Please pick a board connected to the port you have selected.", "port": "Portul{0}", - "portLabel": "Port: {0}", "ports": "ports", "programmer": "Programator", "reselectLater": "Re-selectează mai târziu", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Selectează Placa", "selectPortForInfo": "Please select a port to obtain board info.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Boards Manager", @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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.", @@ -251,7 +250,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", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/ru.json b/i18n/ru.json index 06f0ae305..ce280aae8 100644 --- a/i18n/ru.json +++ b/i18n/ru.json @@ -18,24 +18,21 @@ "configDialog1": "Выберите плату и порт, если Вы хотите загрузить скетч в плату.", "configDialog2": "Если вы выбираете только плату, вы сможете компилировать, но не загружать свой скетч.", "couldNotFindPreviouslySelected": "Не удалось найти ранее выбранную плату '{0}' в установленной платформе '{1}'.Пожалуйста, выберите плату которую хотите использовать вручную повторно. Вы хотите повторно выбрать её сейчас?", - "disconnected": "Плата Arduino не подключена", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "Получить информацию о подключенной плате", "inSketchbook": " (в альбоме).", "installNow": "Необходимо установить ядро «{0} {1}» для выбранной в данный момент «{2}» платы. Вы хотите установить его сейчас?", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "FQBN недоступен для выбранной платы \"{0}\". Проверьте наличие необходимого ядра.", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Не выбраны порты для платы: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Плата не выбрана.", "openBoardsConfig": "Выберите другую плату и порт...", "pleasePickBoard": "Пожалуйста, выберите плату, подключенную к выбранному вами порту.", "port": "Порт{0}", - "portLabel": "Порт:{0}", "ports": "ports", "programmer": "Программатор", "reselectLater": "Перевыбрать позже", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Выбор платы", "selectPortForInfo": "Пожалуйста, выберите порт в меню инструментов для получения информации с платы.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Платформа установлена успешно {0}:{1}", "succesfullyUninstalledPlatform": "Платформа успешно удалена {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Менеджер плат", @@ -215,6 +213,11 @@ "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": "Больше не спрашивать" }, @@ -230,10 +233,6 @@ "previousError": "Предыдущая ошибка", "revealError": "Reveal Error" }, - "electron": { - "couldNotSave": "Скетч не сохранён. Пожалуйста, скопируйте вашу не сохраненную работу в ваш внешний текстовый редактор и перезапустите IDE.", - "unsavedChanges": "Любые не сохраненные изменения не будут сохранены." - }, "examples": { "builtInExamples": "Встроенные Примеры", "couldNotInitializeExamples": "Невозможно инициализировать встроенные примеры.", @@ -251,7 +250,7 @@ "selectBoard": "Выбор платы", "selectVersion": "Выберите версию прошивки", "successfullyInstalled": "Прошивка успешно установлена.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Окружение", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "language.log": "True - сервер Arduino Language будет создавать файлы журнала в папке скетча. В противном случае - false. По умолчанию - false.", "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": "Выбрать новое расположение для альбома со скетчами", "noCliConfig": "Could not load the CLI configuration", @@ -428,7 +434,6 @@ "sketch": { "archiveSketch": "Архивировать скетч", "cantOpen": "Папка \"{0}\" уже существует. Невозможно открыть скетч.", - "close": "Вы действительно хотите закрыть скетч?", "compile": "Компиляция скетча...", "configureAndUpload": "Configure and Upload", "createdArchive": "Создать архив '{0}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/sl.json b/i18n/sl.json deleted file mode 100644 index 08a47309e..000000000 --- a/i18n/sl.json +++ /dev/null @@ -1,538 +0,0 @@ -{ - "arduino": { - "about": { - "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", - "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", - "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?", - "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", - "ports": "ports", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "searchBoard": "Search board", - "selectBoard": "Select Board", - "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}", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" - }, - "boardsManager": "Boards Manager", - "boardsType": { - "arduinoCertified": "Arduino Certified" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning 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." - }, - "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 '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" - }, - "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", - "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": "Share...", - "shareSketch": "Share Sketch", - "showHideSketchbook": "Show/Hide Cloud 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." - }, - "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", - "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", - "selectedOn": "on {0}", - "serialMonitor": "Serial Monitor", - "type": "Type", - "unknown": "Unknown", - "updateable": "Updatable" - }, - "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": "Remove", - "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}'", - "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?" - }, - "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" - }, - "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": { - "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." - }, - "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "include": "Include Library", - "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?", - "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 {0}:{1} needs some other dependencies currently not installed:", - "needsOneDependency": "The library {0}:{1} 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.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", - "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.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": { - "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.", - "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.", - "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", - "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" - }, - "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" - }, - "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." - }, - "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": "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" - }, - "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/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 {0}:{1} needs another dependency currently not installed:", - "needsMultipleDependencies": "The library {0}:{1} 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 989a1a542..0924a707d 100644 --- a/i18n/sr.json +++ b/i18n/sr.json @@ -18,24 +18,21 @@ "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?", "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Ниједан порт није одабран за плочу: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Ниједна плоча није одабрана.", "openBoardsConfig": "Одабери другу плочу и порт...", "pleasePickBoard": "Одабери плочу повезану са одабраним портом.", "port": "Порт{0}", - "portLabel": "Port: {0}", "ports": "ports", "programmer": "Програмер", "reselectLater": "Одабери поново касније", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Search board", "selectBoard": "Одабери плочу", "selectPortForInfo": "Одабери порт да добијеш информације о плочи", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Успјешно инсталирана платформа {0}:{1}", "succesfullyUninstalledPlatform": "Успјешно деинсталирана платформа {0}:{1}", "typeOfPorts": "{0} ports", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "Unknown board" }, "boardsManager": "Управљач плочама", @@ -215,6 +213,11 @@ "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": "Не питај поново" }, @@ -230,10 +233,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": "Није могуће иницијализовати уграђене примјере.", @@ -251,7 +250,7 @@ "selectBoard": "Одабери плочу", "selectVersion": "Одаберзи верзију фирмвера", "successfullyInstalled": "Фирмвер успјешно инсталиран.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Окружење", @@ -282,6 +281,10 @@ "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 библиотеке", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "sketch": { "archiveSketch": "Архивирај рад", "cantOpen": "Директоријум \"{0}\" већ постоји. Није могуће отворити рад.", - "close": "Да ли желиш да затвориш рад?", "compile": "Compiling sketch...", "configureAndUpload": "Configure and Upload", "createdArchive": "Направљена архива '{0}'.", @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, diff --git a/i18n/sv.json b/i18n/sv.json deleted file mode 100644 index 08a47309e..000000000 --- a/i18n/sv.json +++ /dev/null @@ -1,538 +0,0 @@ -{ - "arduino": { - "about": { - "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", - "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", - "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?", - "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", - "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", - "ports": "ports", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "searchBoard": "Search board", - "selectBoard": "Select Board", - "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}", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" - }, - "boardsManager": "Boards Manager", - "boardsType": { - "arduinoCertified": "Arduino Certified" - }, - "bootloader": { - "burnBootloader": "Burn Bootloader", - "burningBootloader": "Burning 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." - }, - "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 '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" - }, - "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", - "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": "Share...", - "shareSketch": "Share Sketch", - "showHideSketchbook": "Show/Hide Cloud 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." - }, - "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", - "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", - "selectedOn": "on {0}", - "serialMonitor": "Serial Monitor", - "type": "Type", - "unknown": "Unknown", - "updateable": "Updatable" - }, - "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": "Remove", - "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}'", - "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?" - }, - "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" - }, - "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": { - "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." - }, - "library": { - "addZip": "Add .ZIP Library...", - "arduinoLibraries": "Arduino libraries", - "contributedLibraries": "Contributed libraries", - "include": "Include Library", - "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?", - "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 {0}:{1} needs some other dependencies currently not installed:", - "needsOneDependency": "The library {0}:{1} 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.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", - "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.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": { - "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.", - "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.", - "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", - "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" - }, - "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" - }, - "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." - }, - "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": "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" - }, - "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/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 {0}:{1} needs another dependency currently not installed:", - "needsMultipleDependencies": "The library {0}:{1} 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 {0}:{1} needs another dependency currently not installed:", - "needsMultipleDependencies": "The library {0}:{1} 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 index c00cfd34c..f686149c5 100644 --- a/i18n/th.json +++ b/i18n/th.json @@ -1,13 +1,13 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "detail": "เวอร์ชัน: {0}\nวันที่: {1}{2}\nเวอร์ชัน CLI: {3}\n\n{4}", "label": "เกี่ยวกับ{0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", - "goToIoTCloud": "Go to IoT Cloud", - "goToProfile": "Go to Profile", + "goToCloudEditor": "ไปยัง Cloud Editor", + "goToIoTCloud": "ไปยัง IoT Cloud", + "goToProfile": "ไปยัง Profile", "menuTitle": "Arduino Cloud" }, "board": { @@ -16,47 +16,45 @@ "boardInfo": "ข้อมูลบอร์ด", "boards": "บอร์ด", "configDialog1": "เลือกบอร์ดและพอร์ตที่คุณต้องการอัปโหลดโปรแกรมของคุณ", - "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?", - "noBoardsFound": "No boards found for \"{0}\"", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", + "configDialog2": "หากคุณแค่เลือกบอร์ดคุณจะสามารถคอมไพล์ได้ แต่สเก็ตช์ของคุณจะไม่ถูกอัปโหลด", + "couldNotFindPreviouslySelected": "ไม่สามาถหาบอร์ด {0} ที่ถูกเลือกไว้ก่อนหน้านี้พบในแพลตฟอร์มที่ถูกติดตั้ง {1} กรุณาเลือกบอร์ดที่คุณต้องการใช้งานด้วยตัวเอง คุณต้องการเลือกใหม่ในตอนนี้หรือไม่?", + "editBoardsConfig": "Edit Board and Port...", + "getBoardInfo": "เรียกดูข้อมูลของบอร์ด", + "inSketchbook": "(ใน Sketchbook)", + "installNow": "คอร์ \"{0}{1}\" ต้องถูกติดตั้งสำหรับบอร์ด \"{2}\" ที่ถูกเลือก คุณต้องการติดตั้งในตอนนี้หรือไม่?", + "noBoardsFound": "ไม่พบบอร์ด \"{0}\"", "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "No ports selected for board: '{0}'.", + "noPortsDiscovered": "ไม่พบพอร์ต", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "No boards selected.", - "openBoardsConfig": "Select other board and port…", - "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", - "ports": "ports", - "programmer": "Programmer", - "reselectLater": "Reselect later", - "searchBoard": "Search board", - "selectBoard": "Select Board", - "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}", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" - }, - "boardsManager": "Boards Manager", + "openBoardsConfig": "เลือกบอร์ดอื่นและพอร์ต...", + "pleasePickBoard": "กรุณาเลือกบอร์ดที่เชื่อมต่อกับพอร์ตที่คุณได้เลือกไว้", + "port": "พอร์ต {0}", + "ports": "พอร์ต", + "programmer": "เครื่องโปรแกรม", + "reselectLater": "เลือกใหม่ในภายหลัง", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", + "searchBoard": "ค้นหาบอร์ด", + "selectBoard": "เลือกบอร์ด", + "selectPortForInfo": "กรุณาเลือกพอร์ตเพื่อดึงข้อมูลของบอร์ด", + "showAllAvailablePorts": "แสดงพอร์ตทั้งหมดที่มีอยู่เมื่อเลือก", + "showAllPorts": "แสดงพอร์ตทั้งหมด", + "succesfullyInstalledPlatform": "ติดตั้งแพลตฟอร์ม {0}:{1} สำเร็จ", + "succesfullyUninstalledPlatform": "ถอนการติดตั้งแพลตฟอร์ม {0}:{1} สำเร็จ", + "typeOfPorts": "{0} พอร์ต", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "บอร์ดที่ไม่รู้จัก" + }, + "boardsManager": "ตัวจัดการบอร์ด", "boardsType": { "arduinoCertified": "Arduino Certified" }, "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", @@ -70,7 +68,7 @@ "selectBoard": "Select a board...", "selectCertificateToUpload": "1. Select certificate to upload", "selectDestinationBoardToUpload": "2. Select destination board and upload certificate", - "upload": "Upload", + "upload": "อัปโหลด", "uploadFailed": "Upload failed. Please try again.", "uploadRootCertificates": "Upload SSL Root Certificates", "uploadingCertificates": "Uploading certificates." @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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.", @@ -248,10 +247,10 @@ "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", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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}'.", @@ -458,7 +463,7 @@ "sketchbook": "Sketchbook", "titleLocalSketchbook": "Local Sketchbook", "titleSketchbook": "Sketchbook", - "upload": "Upload", + "upload": "อัปโหลด", "uploadUsingProgrammer": "Upload Using Programmer", "uploading": "Uploading...", "userFieldsNotFoundError": "Can't find user fields for connected board", @@ -470,16 +475,17 @@ "newSketch": "New Sketch" }, "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." + "answerSurvey": "ตอบแบบสอบถาม", + "dismissSurvey": "ไม่แสดงสิ่งนี้อีก", + "surveyMessage": "กรุณาช่วยพวกเราปรับปรุงพัฒนาโดยตอบแบบสอบถามสั้นมากเหล่านี้ พวกเราเล็งเห็นถึงคุณค่าของคอมมูนิตี้และอยากที่จะทำความเข้าใจผู้สนับสนุนของเราให้ได้ดีขึ้นมากกว่าเดิมแม้เพียงสักเล็กน้อย" }, "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", + "dark": "มืด", "deprecated": "{0} (deprecated)", - "hc": "High Contrast", - "light": "Light", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "สว่าง", "user": "{0} (user)" }, "title": { @@ -494,9 +500,9 @@ "error": "{0} error: {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.", @@ -514,25 +520,25 @@ "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.", + "couldNotSave": "ไม่สามารถบันทึกสเก็ตช์ได้ กรุณาคัดลอกงานที่ยังไม่ถูกบันทึกไปยังโปรแกรม Text Editor อื่นที่คุณใช้งาน และรีสตาร์ท IDE", "daemonOffline": "CLI Daemon Offline", "offline": "Offline", "offlineText": "Offline", - "quitTitle": "Are you sure you want to quit?" + "quitTitle": "คุณแน่ใจว่าต้องการออกใช่หรือไม่" }, "editor": { "unsavedTitle": "Unsaved – {0}" }, "messages": { - "collapse": "Collapse", - "expand": "Expand" + "collapse": "พับ", + "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", + "fileNewName": "ชื่อสำหรับไฟล์ใหม่", "invalidExtension": ".{0} is not a valid extension", - "newFileName": "New name for file" + "newFileName": "ชื่อใหม่สำหรับไฟล์" } } } diff --git a/i18n/tr.json b/i18n/tr.json index afef553bb..594738a54 100644 --- a/i18n/tr.json +++ b/i18n/tr.json @@ -18,24 +18,21 @@ "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?", "noBoardsFound": "\"{0}\" için kart bulunamadı", - "noFQBN": "FQBN seçili kart \"{0}\" için mevcut değil. İlgili çekirdeği kurdunuz mu?", "noNativeSerialPort": "Yerel seri port, veri alınamıyor.", "noPortsDiscovered": "Port bulunamadı", - "noPortsSelected": "'{0}' kartı için port seçilmedi", "nonSerialPort": "Seri port değil, veri alınamıyor.", - "noneSelected": "Kart seçilmedi.", "openBoardsConfig": "Başka Kart ve Port Seç", "pleasePickBoard": "Lütfen seçtiğiniz porta bağlı kartı seçin.", "port": "Port{0}", - "portLabel": "Port{0}", "ports": "portlar", "programmer": "Programlayıcı", "reselectLater": "Daha sonra tekrar seç", + "revertBoardsConfig": " '{1}''da bulunan '{0}''i kullan", "searchBoard": "Kart ara", "selectBoard": "Kart Seç", "selectPortForInfo": "Kart bilgisi almak için lütfen bir port seçin.", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "Platform başarıyla kuruldu {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", @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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ı.", @@ -251,7 +250,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", @@ -282,6 +281,10 @@ "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", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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.", @@ -478,7 +483,8 @@ "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": "Yüksek Karşıtlık", + "hc": "Koyu Yüksek Karşıtlık", + "hcLight": "Açık Yüksek Karşıtlık", "light": "Açık", "user": "{0} (kullanıcı)" }, diff --git a/i18n/uk.json b/i18n/uk.json index 48106a3db..ec6fdaa11 100644 --- a/i18n/uk.json +++ b/i18n/uk.json @@ -18,35 +18,33 @@ "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": " (in Sketchbook)", "installNow": "The \"{0} {1}\" core has to be installed for the currently selected \"{2}\" board. Do you want to install it now?", "noBoardsFound": "Для \"{0}\" не знайдено плат", - "noFQBN": "The FQBN is not available for the selected board \"{0}\". Do you have the corresponding core installed?", "noNativeSerialPort": "Native serial port, can't obtain info.", "noPortsDiscovered": "Порти не знайдено", - "noPortsSelected": "Немає вибраних портів для плати: '{0}'.", "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Не обрана плата", "openBoardsConfig": "Оберіть іншу плату або порт", "pleasePickBoard": "Please pick a board connected to the port you have selected.", - "port": "Port{0}", - "portLabel": "Port: {0}", - "ports": "ports", - "programmer": "Programmer", + "port": "Порт{0}", + "ports": "порти", + "programmer": "Програматор", "reselectLater": "Reselect later", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "Шукати плату", "selectBoard": "Оберіть плату", "selectPortForInfo": "Please select a port to obtain board info.", "showAllAvailablePorts": "Shows all available ports when enabled", - "showAllPorts": "Show all ports", + "showAllPorts": "Показати всі порти", "succesfullyInstalledPlatform": "Successfully installed platform {0}:{1}", "succesfullyUninstalledPlatform": "Successfully uninstalled platform {0}:{1}", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" + "typeOfPorts": "{0}порти", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Невідома плата" }, - "boardsManager": "Boards Manager", + "boardsManager": "Менеджер плат", "boardsType": { "arduinoCertified": "Arduino Certified" }, @@ -81,8 +79,8 @@ "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": "Оновлення плат...", + "updatingLibraries": "Оновлення бібліотек..." }, "cli-error-parser": { "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include '?", @@ -91,7 +89,7 @@ "cloud": { "chooseSketchVisibility": "Choose visibility of your Sketch:", "cloudSketchbook": "Cloud Sketchbook", - "connected": "Connected", + "connected": "Під'єднано", "continue": "Продовжити", "donePulling": "Done pulling '{0}'.", "donePushing": "Done pushing '{0}'.", @@ -136,7 +134,7 @@ "synchronizingSketchbook": "Synchronizing sketchbook..." }, "common": { - "all": "Все", + "all": "Всі", "contributed": "Contributed", "installManually": "Install Manually", "later": "Пізніше", @@ -167,12 +165,12 @@ "installVersion": "Install {0}", "installed": "{0} installed", "moreInfo": "Більше інформації ", - "otherVersions": "Other Versions", + "otherVersions": "Інші Версії", "remove": "Видалити ", "title": "{0} by {1}", "uninstall": "Видалити", "uninstallMsg": "Do you want to uninstall {0}?", - "update": "Update" + "update": "Оновити" }, "configuration": { "cli": { @@ -193,8 +191,8 @@ "core": { "compilerWarnings": { "all": "Все", - "default": "Default", - "more": "More", + "default": "По замовчуванню", + "more": "Більше", "none": "None" } }, @@ -215,6 +213,11 @@ "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": "Не питати знову" }, @@ -230,10 +233,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.", @@ -251,7 +250,7 @@ "selectBoard": "Оберіть плату", "selectVersion": "Select firmware version", "successfullyInstalled": "Firmware successfully installed.", - "updater": "WiFi101 / WiFiNINA Firmware Updater" + "updater": "Firmware Updater" }, "help": { "environment": "Environment", @@ -278,10 +277,14 @@ "newVersionAvailable": "A new version of Arduino IDE ({0}) is available for download.", "noUpdatesAvailable": "There are no recent updates available for the Arduino IDE", "notNowButton": "Не зараз", - "skipVersionButton": "Skip Version", + "skipVersionButton": "Пропустити Версію", "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", @@ -300,7 +303,7 @@ "needsOneDependency": "The library {0}:{1} 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", + "title": "Менеджер бібліотек", "uninstalledSuccessfully": "Successfully uninstalled library {0}:{1}", "zipLibrary": "Бібліотеки " }, @@ -325,7 +328,7 @@ "menu": { "advanced": "Advanced", "sketch": "Sketch", - "tools": "Tools" + "tools": "Інструменти" }, "monitor": { "alreadyConnectedError": "Could not connect to {0} {1} port. Already connected.", @@ -381,14 +384,17 @@ "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": "Мережа", "newSketchbookLocation": "Select new sketchbook location", "noCliConfig": "Could not load the CLI configuration", "noProxy": "Нема проксі", "proxySettings": { "hostname": "Host name", - "password": "Password", - "port": "Port number", + "password": "Пароль", + "port": "Номер порту", "username": "Username" }, "showVerbose": "Show verbose output during", @@ -417,7 +423,7 @@ "carriageReturn": "Carriage Return", "connecting": "Connecting to '{0}' on '{1}'...", "message": "Message (Enter to send message to '{0}' on '{1}')", - "newLine": "Нова лінія", + "newLine": "Новий рядок", "newLineCarriageReturn": "Both NL & CR", "noLineEndings": "No Line Ending", "notConnected": "Not connected. Select a board and a port to connect automatically.", @@ -428,12 +434,11 @@ "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.", + "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", @@ -447,7 +452,7 @@ "new": "New Sketch", "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Відкрити папку", - "openRecent": "Open Recent", + "openRecent": "Відкрити останній", "openSketchInNewWindow": "Open Sketch in New Window", "reservedFilename": "'{0}' is a reserved filename.", "saveFolderAs": "Save sketch folder as...", @@ -460,7 +465,7 @@ "titleSketchbook": "Sketchbook", "upload": "Завантажити", "uploadUsingProgrammer": "Upload Using Programmer", - "uploading": "Uploading...", + "uploading": "Завантаження..", "userFieldsNotFoundError": "Can't find user fields for connected board", "verify": "Перевірити ", "verifyOrCompile": "Verify/Compile" @@ -478,7 +483,8 @@ "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": "High Contrast", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", "light": "Light", "user": "{0} (user)" }, @@ -495,7 +501,7 @@ }, "userFields": { "cancel": "Відміна ", - "enterField": "Enter {0}", + "enterField": "Ввід{0}", "upload": "Завантажити" }, "validateSketch": { 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 {0}:{1} needs another dependency currently not installed:", - "needsMultipleDependencies": "The library {0}:{1} 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/uz.json b/i18n/uz.json deleted file mode 100644 index 19a3645e0..000000000 --- a/i18n/uz.json +++ /dev/null @@ -1,380 +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", - "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.", - "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.", - "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." - }, - "cli-error-parser": { - "keyboardError": "'Keyboard' not found. Does your sketch include the line '#include '?", - "mouseError": "'Mouse' not found. Does your sketch include the line '#include '?" - }, - "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." - }, - "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" - }, - "coreContribution": { - "copyError": "Copy error messages" - }, - "daemon": { - "restart": "Restart Daemon", - "start": "Start Daemon", - "stop": "Stop Daemon" - }, - "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", - "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." - }, - "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": { - "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." - }, - "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 {0}:{1} needs some other dependencies currently not installed:", - "needsOneDependency": "The library {0}:{1} 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": { - "advanced": "Advanced", - "sketch": "Sketch", - "tools": "Tools" - }, - "monitor": { - "unableToCloseWebSocket": "Unable to close websocket", - "unableToConnectToWebSocket": "Unable to connect to websocket" - }, - "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", - "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", - "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" - }, - "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", - "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" - }, - "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." - }, - "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" - } - } -} diff --git a/i18n/vi.json b/i18n/vi.json index 7b65daa25..59f855bfb 100644 --- a/i18n/vi.json +++ b/i18n/vi.json @@ -1,50 +1,48 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "detail": "Phiên bản: {0}\nNgày: {1}{2}\nPhiên bản CLI: {3}\n\n{4}", "label": "Về {0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", - "goToIoTCloud": "Go to IoT Cloud", - "goToProfile": "Go to Profile", - "menuTitle": "Arduino Cloud" + "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", "boardInfo": "Thông tin bo mạch", - "boards": "boards", + "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": "Edit Board and Port...", "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?", "noBoardsFound": "No boards found for \"{0}\"", - "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?", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "No ports discovered", - "noPortsSelected": "Không có cổng được chọn cho bo mạch: '{0}'.", - "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "Không có bo mạch được chọn.", + "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...", "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": "ports", + "ports": "cổng", "programmer": "Programmer", "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", "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": "Show all ports", + "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}", "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "Bảng không xác định" }, "boardsManager": "Trình quản lý bo mạch", "boardsType": { @@ -77,12 +75,12 @@ }, "checkForUpdates": { "checkForUpdates": "Check for Arduino Updates", - "installAll": "Install All", + "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 '?", @@ -97,7 +95,7 @@ "donePushing": "Done pushing '{0}'.", "embed": "Nhúng: ", "emptySketchbook": "Sketchbook của bạn đang trống", - "goToCloud": "Go to Cloud", + "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.", @@ -121,14 +119,14 @@ "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": "New Cloud Sketch", + "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}'...", @@ -136,23 +134,23 @@ "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", "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", "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" }, "compile": { "error": "Lỗi biên dịch: {0}" @@ -163,16 +161,16 @@ "clickToOpen": "Click to open in browser: {0}", "filterSearch": "Lọc kết quả tìm kiếm của bạn...", "install": "Cài đặt", - "installLatest": "Install Latest", + "installLatest": "Cài đặt mới nhất", "installVersion": "Install {0}", "installed": "{0} installed", "moreInfo": "Thêm thông tin", - "otherVersions": "Other Versions", + "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}?", - "update": "Update" + "update": "Cập nhập" }, "configuration": { "cli": { @@ -192,7 +190,7 @@ }, "core": { "compilerWarnings": { - "all": "All", + "all": "Tất cả", "default": "Default", "more": "More", "none": "None" @@ -215,6 +213,11 @@ "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" }, @@ -230,10 +233,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.", @@ -251,7 +250,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": "Firmware Updater" }, "help": { "environment": "Môi trường", @@ -282,12 +281,16 @@ "updateAvailable": "Cập nhật khả dụng", "versionDownloaded": "Arduino IDE {0} đã được tải về." }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "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", "include": "Thêm thư viện", - "installAll": "Install All", + "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?", @@ -381,6 +384,9 @@ "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", @@ -428,7 +434,6 @@ "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": "Configure and Upload", "createdArchive": "Đã tạo tệp nén '{0]'.", @@ -444,7 +449,7 @@ "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": "New Sketch", + "new": "Bản phác thảo mới", "noTrailingPeriod": "A filename cannot end with a dot", "openFolder": "Mở thư mục", "openRecent": "Mở gần đây", @@ -460,30 +465,31 @@ "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" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "Bản phác thảo đám mây mới", + "newSketch": "Bản phác thảo mới" }, "survey": { - "answerSurvey": "Answer survey", - "dismissSurvey": "Don't show again", + "answerSurvey": "Trả lời khảo sát", + "dismissSurvey": "Không hiển thị lại", "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." }, "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", + "dark": "Tối", "deprecated": "{0} (deprecated)", - "hc": "High Contrast", - "light": "Light", + "hc": "Độ tương phản tối cao", + "hcLight": "Độ tương phản cao nhẹ", + "light": "Sáng", "user": "{0} (user)" }, "title": { - "cloud": "Cloud" + "cloud": "Đám mây" }, "updateIndexes": { "updateIndexes": "Update Indexes", @@ -500,11 +506,11 @@ }, "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", + "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": "Invalid sketch filename", + "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": "Invalid sketch name" + "renameSketchFolderTitle": "Tên bản phác thảo không hợp lệ" }, "workspace": { "alreadyExists": "'{0}' already exists." @@ -518,7 +524,7 @@ "daemonOffline": "Trình chạy nền CLI ngoại tuyến", "offline": "Ngoại tuyến", "offlineText": "Ngoại tuyến", - "quitTitle": "Are you sure you want to quit?" + "quitTitle": "Bạn có chắc bạn muốn thoát khỏi?" }, "editor": { "unsavedTitle": "Chưa được lưu – {0}" diff --git a/i18n/zh-Hant.json b/i18n/zh-Hant.json index cff284a55..19c099037 100644 --- a/i18n/zh-Hant.json +++ b/i18n/zh-Hant.json @@ -5,54 +5,52 @@ "label": "關於 {0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", - "goToIoTCloud": "Go to IoT Cloud", - "goToProfile": "Go to Profile", - "menuTitle": "Arduino Cloud" + "goToCloudEditor": "前往雲端編輯器", + "goToIoTCloud": "前往物聯網雲", + "goToProfile": "到個人資訊", + "menuTitle": "Arduino雲" }, "board": { "board": "{0} 開發板", - "boardConfigDialogTitle": "選擇其他開發板和序列埠", + "boardConfigDialogTitle": "選擇其他開發板和埠", "boardInfo": "開發板資訊", "boards": "開發板", - "configDialog1": "若要上傳草稿碼, 請選取開發板及連接埠", - "configDialog2": "如果只有選取開發板, 可以編譯但無法上傳草稿碼", - "couldNotFindPreviouslySelected": "在安装的平台{1}中沒有找到之前選取的開發板{0}。請手動選取要使用的開發板。現在要重新選取嗎?", - "disconnected": "已中斷連線", + "configDialog1": "若要上傳 Sketch 請選擇開發板及埠", + "configDialog2": "單選擇開發板只能編譯,不能上傳", + "couldNotFindPreviouslySelected": "已安装平台{1}中找不到您選的開發板{0}。請手動選擇。你想選擇嗎?", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "取得開發板資訊", - "inSketchbook": "(在草稿碼簿中)", - "installNow": "必須為目前選定的 {2} 開發板安裝 {0} {1} 核心, 你要現在安裝嗎?", - "noBoardsFound": "找不到 \"{0}\" 相關的開發板", - "noFQBN": "所選擇的 \"{0}\" 開發版並沒有對應的 FQBN。你是否有安裝對應的核心?", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "沒有找到序列埠", - "noPortsSelected": "沒有幫 '{0}' 開發板選取序列埠", - "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "沒有選取開發板", - "openBoardsConfig": "選取其他的開發板與序列埠...", - "pleasePickBoard": "請選取連接到你所選用序列埠的開發板", - "port": "{0} 序列埠", - "portLabel": "序列埠:{0}", - "ports": "序列埠", + "inSketchbook": "(在 sketchbook 內)", + "installNow": "選取的 {2} 開發板必須安裝 {0} {1} 核心程式,要現在安裝嗎?", + "noBoardsFound": "開發板 {0} 未找到", + "noNativeSerialPort": "無法獲得序列埠的資訊。", + "noPortsDiscovered": "未找到連接埠", + "nonSerialPort": "非序列埠,無法取得資訊。", + "openBoardsConfig": "選擇其他開發板及連接埠", + "pleasePickBoard": "請選擇已連接上的開發版", + "port": "連接埠: {0}", + "ports": "連接埠", "programmer": "燒錄器", "reselectLater": "請稍後再選擇", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "搜尋開發板", "selectBoard": "選擇開發版", - "selectPortForInfo": "請選取序列埠以取得開發板的資訊", - "showAllAvailablePorts": "啟用時顯示所有可用的序列埠", - "showAllPorts": "顯示所有的序列埠", - "succesfullyInstalledPlatform": "已成功安装 {0}:{1} 平台", - "succesfullyUninstalledPlatform": "已成功移除 {0}:{1} 平台", - "typeOfPorts": "{0} 序列埠", - "unknownBoard": "Unknown board" + "selectPortForInfo": "請選定連接埠以便取得開發板的資訊", + "showAllAvailablePorts": "當開啟時,顯示所有可用的埠", + "showAllPorts": "顯示所有連接埠", + "succesfullyInstalledPlatform": "成功安裝平台 {0}:{1}", + "succesfullyUninstalledPlatform": "成功卸載平台 {0}:{1}", + "typeOfPorts": "{0}連接埠", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "未知的開發版" }, "boardsManager": "開發板管理員", "boardsType": { - "arduinoCertified": "經 Arduino 認證" + "arduinoCertified": "Arduino 認證" }, "bootloader": { "burnBootloader": "燒錄 Bootloader", - "burningBootloader": "正在燒錄 Bootloader", + "burningBootloader": "正在燒錄 bootloader ...", "doneBurningBootloader": "Bootloader 燒錄完成" }, "burnBootloader": { @@ -60,135 +58,135 @@ }, "certificate": { "addNew": "新增", - "addURL": "加入 URL 以提取 SSL 憑證", + "addURL": "加入 URL 以提取 SSL 憑証", "boardAtPort": "{0} 在 {1}", - "certificatesUploaded": "憑證已上傳", + "certificatesUploaded": "憑証已上傳", "enterURL": "輸入網址", - "noSupportedBoardConnected": "不支援目前連接的開發板", - "openContext": "Open context", + "noSupportedBoardConnected": "已接上未被支援的開發板", + "openContext": "開啟內文", "remove": "移除", "selectBoard": "選擇開發板...", - "selectCertificateToUpload": "1. 選擇要上傳的憑證", - "selectDestinationBoardToUpload": "2. 選擇目標開發板並上傳憑證", + "selectCertificateToUpload": "1. 選擇憑証上傳", + "selectDestinationBoardToUpload": "2. 選擇開發板並上傳憑証", "upload": "上傳", "uploadFailed": "上傳失敗, 請再試一次", - "uploadRootCertificates": "上傳 SSL 根憑證", - "uploadingCertificates": "正在上傳憑證" + "uploadRootCertificates": "上傳SSL根憑証", + "uploadingCertificates": "上傳憑証中..." }, "checkForUpdates": { "checkForUpdates": "檢查 Arduino 更新", "installAll": "全部安装", - "noUpdates": "沒有可用的最新更新。", - "promptUpdateBoards": "某些開發板有可用更新。", - "promptUpdateLibraries": "某些函式庫有可用更新。", + "noUpdates": "没有更新版。", + "promptUpdateBoards": "部分開發板有更新檔。", + "promptUpdateLibraries": "部分程式庫有更新檔。", "updatingBoards": "更新開發板中...", - "updatingLibraries": "更新函式庫中..." + "updatingLibraries": "更新程式庫中..." }, "cli-error-parser": { - "keyboardError": "找不到 'Keyboard', 請檢查草稿碼中是否有 '#include '?", - "mouseError": "找不到 'Mouse', 請檢查草稿碼中是否有 '#include '?" + "keyboardError": "找不到 'Keyboard',請檢查是否缺少 '#include '。", + "mouseError": "找不到 'Mouse',請檢查是否缺少 '#include '。" }, "cloud": { - "chooseSketchVisibility": "選擇草稿碼的能見度:", - "cloudSketchbook": "Cloud Sketchbook", + "chooseSketchVisibility": "選擇 sketch 的透明度:", + "cloudSketchbook": "雲 sketchbook", "connected": "已連線", "continue": "繼續", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", + "donePulling": "已完成讀取 '{0}' 。", + "donePushing": "已完成推送 '{0}' 。", "embed": "嵌入:", - "emptySketchbook": "您的草稿碼簿是空的", - "goToCloud": "前往 Cloud", + "emptySketchbook": "您的 sketchbook 是空的", + "goToCloud": "前往雲端", "learnMore": "了解更多", - "link": "連結:", - "notYetPulled": "尚未拉取, 無法推送到 Cloud。", + "link": "鏈結:", + "notYetPulled": "無法推送到雲端。尚未被讀取。", "offline": "離線", - "openInCloudEditor": "在 Cloud Editor 中開啟", + "openInCloudEditor": "在雲編輯器中打開", "options": "選項...", - "privateVisibility": "私人。只有你可以檢視草稿碼。", - "profilePicture": "頭像圖片", - "publicVisibility": "公開。擁有連結的人都可以檢視草稿碼。", - "pull": "拉取", - "pullFirst": "你必須先拉取才能推送至 Cloud。", - "pullSketch": "拉取草稿碼", - "pullSketchMsg": "從 Cloud 拉取這個草稿碼將會覆蓋本地的版本, 你確定要繼續嗎?", + "privateVisibility": "私人的。只有你可以查看 sketch。", + "profilePicture": "頭像", + "publicVisibility": "公開的。有連結的人都可以查看 sketch。", + "pull": "讀取", + "pullFirst": "須先讀取才能推送到雲。", + "pullSketch": "讀取 sketch", + "pullSketchMsg": "從雲端中讀取這 sketch 將會覆寫本地端的版本。確定要繼續嗎?", "push": "推送", - "pushSketch": "推送草稿碼", - "pushSketchMsg": "這是公開的草稿碼, 推送前請確認所有敏感資訊都定義在arduino_secrets.h 中。你也可以在分享面板中將草稿碼設定為私人。", + "pushSketch": "推送 sketch", + "pushSketchMsg": "這是公開的 sketch,在推送前,請確認所有敏感資訊已在arduino_secrets.h 內。在分享介面裏可將 sketch 改為私人。", "remote": "遠端", - "share": "分享......", - "shareSketch": "分享草稿碼", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "share": "分享...", + "shareSketch": "分享 sketch", + "showHideSketchbook": "顯示/隱藏雲 sketchbook", "signIn": "登入", - "signInToCloud": "登入 Arduino Cloud", + "signInToCloud": "登入Arduino 雲", "signOut": "登出", "sync": "同步", - "syncEditSketches": "同步並編輯你的 Arduino Cloud 草稿碼", - "visitArduinoCloud": "前往 Arduino Cloud 建立雲端草稿碼。" + "syncEditSketches": "同步和編輯 Arduino 雲內的 sketch", + "visitArduinoCloud": "前往Arduino 雲以新增雲 sketch。" }, "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": "正在同步遠端草稿碼簿, 拉取 \"{0}\" 中...", - "pushing": "Synchronizing sketchbook, pushing '{0}'...", - "renaming": "Renaming cloud sketch from '{0}' to '{1}'...", - "synchronizingSketchbook": "Synchronizing sketchbook..." + "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": "沒有選取開發版", + "noBoardSelected": "未選取開發板", "notConnected": "[未連接]", - "offlineIndicator": "您目前處於離線狀態, 在沒有網路的情況下, Arduino 命令列介面將無法下載需要的資源, 並可能造成功能無法正常運作。請連接至網路並重新啟動程式。", - "oldFormat": "'{0}' 仍然使用舊的 `.pde` 格式, 是否要轉換成新的 `.ino` 副檔名?", - "partner": "協力伙伴", - "processing": "Processing", + "offlineIndicator": "您目前處於離線狀態,在沒有網路的情況下,Arduino命令列介面將無法下載需要的資源,並可能導致錯誤。請連接至網路並重新啟動程式。", + "oldFormat": "'{0}'仍然使用舊的 `.pde` 格式,要切換成新版 `.ino` 嗎?", + "partner": "合作夥伴", + "processing": "資料處理中", "recommended": "推薦", "retired": "不再支援", "selectedOn": "在 {0}", - "serialMonitor": "序列埠監控視窗", + "serialMonitor": "序列埠監控窗", "type": "類型", "unknown": "未知", "updateable": "可更新" }, "compile": { - "error": "編譯錯誤:{0} " + "error": "編譯錯誤:{0} " }, "component": { - "boardsIncluded": "包含在此套件的開發版:", + "boardsIncluded": "本套件內建的開發版:", "by": "提供者:", - "clickToOpen": "Click to open in browser: {0}", + "clickToOpen": "點擊以瀏覽器開啟:{0}", "filterSearch": "篩選搜尋結果...", "install": "安裝", - "installLatest": "Install Latest", - "installVersion": "Install {0}", - "installed": "{0} installed", + "installLatest": "安装最新版本", + "installVersion": "安裝 {0}", + "installed": "{0}已安裝", "moreInfo": "詳細資訊", - "otherVersions": "Other Versions", + "otherVersions": "其它版本", "remove": "移除", - "title": "{0} by {1}", - "uninstall": "移除安裝", - "uninstallMsg": "你要移除 {0} 嗎?", - "update": "Update" + "title": "{0} / {1}", + "uninstall": "卸載", + "uninstallMsg": "你要卸載 {0}?", + "update": "更新" }, "configuration": { "cli": { - "inaccessibleDirectory": "無法存取位於 '{0}' :{1} 的草稿碼簿。" + "inaccessibleDirectory": "無法存取 sketchbook 內的 '{0}' :{1}" } }, "connectionStatus": { - "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + "connectionLost": "失去連線,無法使用雲 sketch 或更新。" }, "contributions": { "addFile": "加入檔案", - "fileAdded": "已加入一個檔案到草稿碼中", + "fileAdded": "一個檔案加入 Sketch", "plotter": { - "couldNotOpen": "無法開啟序列埠繪圖家" + "couldNotOpen": "無法開啟繪圖儀。" }, - "replaceTitle": "替换" + "replaceTitle": "取代" }, "core": { "compilerWarnings": { @@ -200,28 +198,33 @@ }, "coreContribution": { "copyError": "複製錯誤訊息", - "noBoardSelected": "未選取開發版。請從 工具 > 開發版 中選取您的開發版" + "noBoardSelected": "未選取開發版。請從 工具 > 開發版 中選取開發版" }, - "createCloudCopy": "Push Sketch to Cloud", + "createCloudCopy": "推送 sketch 至雲端。", "daemon": { - "restart": "重新啟動背景服務程式", - "start": "啟動背景服務程式", - "stop": "停止背景服務程式" + "restart": "重啟背景程式", + "start": "啟動背景程式", + "stop": "停止背景程式" }, "debug": { "debugWithMessage": "除錯 - {0}", "debuggingNotSupported": "'{0}' 不支援除錯功能。", - "noPlatformInstalledFor": "'{0}' 平台未安装", + "noPlatformInstalledFor": "平台未安裝給'{0}'", "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?" + "sketchIsNotCompiled": "Sketch '{0}' 在除錯前必須已驗證過。請先驗證 sketch 後再除錯。要現在驗證 sketch 嗎?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { "dontAskAgain": "不要再詢問" }, "editor": { - "autoFormat": "自動格式化", - "commentUncomment": "註解/取消註解", - "copyForForum": "複製到論壇使用 (Markdown 格式)", + "autoFormat": "自動格式", + "commentUncomment": "備註/撤除備註", + "copyForForum": "複製到論壇(Markdowm)", "decreaseFontSize": "縮小字體", "decreaseIndent": "減少縮排", "increaseFontSize": "加大字體", @@ -230,14 +233,10 @@ "previousError": "上一個錯誤", "revealError": "顯示錯誤" }, - "electron": { - "couldNotSave": "無法儲存草稿, 請先將尚未存檔的內容複製到慣用的文字編輯器中, 再重新啟動 IDE。", - "unsavedChanges": "任何尚未儲存的修改都不會儲存。" - }, "examples": { "builtInExamples": "內建範例", "couldNotInitializeExamples": "無法初始內建的範例", - "customLibrary": "客製函式庫的範例", + "customLibrary": "客製程式庫的範例", "for": "{0} 的範例", "forAny": "適用各種開發板的範例", "menu": "範例" @@ -247,69 +246,73 @@ "failedInstall": "安裝失敗, 請再試一次", "install": "安裝", "installingFirmware": "安裝韌體", - "overwriteSketch": "安裝會覆蓋掉開發板上的 草稿碼", + "overwriteSketch": "安裝將覆寫開發板上的 Sketch", "selectBoard": "選擇開發版", "selectVersion": "選擇韌體版本", - "successfullyInstalled": "成功安裝韌體", - "updater": "WiFi101 / WiFiNINA 韌體更新" + "successfullyInstalled": "韌體安裝成功", + "updater": "Firmware Updater" }, "help": { - "environment": "IDE 簡介", - "faq": "常見問答集", + "environment": "環境", + "faq": "常見問題", "findInReference": "搜尋參考文件", "gettingStarted": "入門教學", - "keyword": "鍵入關鍵字", + "keyword": "輸入關鍵字", "privacyPolicy": "隱私政策", "reference": "參考文件", "search": "在 Arduino.cc 搜尋", - "troubleshooting": "移難排除", - "visit": "前往 Arduino.cc" + "troubleshooting": "故障排除", + "visit": "造訪 Arduino.cc" }, "ide-updater": { "checkForUpdates": "檢查 Arduino IDE 更新", "closeAndInstallButton": "關閉並安裝。", - "closeToInstallNotice": "關閉軟體並安裝更新。", + "closeToInstallNotice": "關閉本程式後安裝更新。", "downloadButton": "下載", - "downloadingNotice": "正在下載 Arduino IDE 的最新版本。", + "downloadingNotice": "正在下載最新版本的Arduino IDE。", "errorCheckingForUpdates": "檢查 Arduino IDE 更新時發生錯誤。\n{0}", "goToDownloadButton": "前往下載", "goToDownloadPage": "Arduino IDE 有更新版本, 但我們無法自動下載安裝, 請至下載頁面下載最新的版本。", "ideUpdaterDialog": "軟體更新", - "newVersionAvailable": "Arduino IDE 有新版本({0})可供下载。", - "noUpdatesAvailable": "目前 Arduino IDE 没有可更新的版本。", + "newVersionAvailable": "Arduino IDE 有新版本({0})可供下載。", + "noUpdatesAvailable": "Arduino IDE 沒更新檔。", "notNowButton": "現在不要", "skipVersionButton": "略過這個版本", - "updateAvailable": "有可用的更新。", + "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": "函式庫{0}:{1}需要以下未安装的相依元件:", - "needsOneDependency": "函式庫{0}:{1}需要另一個未安装的相依元件:", - "overwriteExistingLibrary": "你要覆蓋既有的函式庫嗎?", - "successfullyInstalledZipLibrary": "從 {0} 歸檔成功安裝函式庫", - "title": "函式庫管理員", - "uninstalledSuccessfully": "成功移除 {0}:{1} 函式庫", - "zipLibrary": "函式庫" + "addZip": "加入 .zip 程式庫 ...", + "arduinoLibraries": "Arduino 程式庫", + "contributedLibraries": "貢獻的程式庫", + "include": "含括程式庫", + "installAll": "安裝全部", + "installLibraryDependencies": "安裝相依的程式庫", + "installMissingDependencies": "要安裝缺少的相依程式嗎?", + "installOneMissingDependency": "要安裝缺少的相依程式庫嗎 ?", + "installWithoutDependencies": "不管相依性直接安裝", + "installedSuccessfully": "成功安裝程式庫 {0}:{1} ", + "libraryAlreadyExists": "程式庫已存在,要覆寫它嗎?", + "manageLibraries": "管理程式庫", + "namedLibraryAlreadyExists": "{0} 程式庫資料夾已存在,要覆寫它嗎?", + "needsMultipleDependencies": "程式庫{0}:{1}需要下列未安裝的相依程式:", + "needsOneDependency": "程式庫{0}:{1}需要其他未安装的相依程式:", + "overwriteExistingLibrary": "要覆寫既有的程式庫嗎?", + "successfullyInstalledZipLibrary": "從 {0} 成功安裝程式庫", + "title": "程式庫管理員", + "uninstalledSuccessfully": "成功卸載程式庫 {0}:{1}", + "zipLibrary": "程式庫" }, "librarySearchProperty": { "topic": "主題" }, "libraryTopic": { - "communication": "通訊", - "dataProcessing": "資料處理", + "communication": "交流", + "dataProcessing": "資料處理中", "dataStorage": "資料儲存", "deviceControl": "裝置控制", "display": "顯示", @@ -324,170 +327,173 @@ }, "menu": { "advanced": "進階", - "sketch": "草稿碼", + "sketch": "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": "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.", + "alreadyConnectedError": "已連線,但無法連到{0} {1}埠。", + "baudRate": "{0}鮑率", + "connectionFailedError": "無法連接 {0} {1} 埠。", + "connectionFailedErrorWithDetails": "{0} 無法連接 {1} {2} 埠。", + "connectionTimeout": "逾時,IDE在連上監看視窗後未收到成功訊息。", + "missingConfigurationError": "無法連上 {0} {1} 埠,監看視窗設定遺失。", + "notConnectedError": "無法連上 {0} {1} 埠。", "unableToCloseWebSocket": "無法關閉 websocket", - "unableToConnectToWebSocket": "無法連線到 websocket" + "unableToConnectToWebSocket": "無法連上 websocket" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "新的雲端 Sketch 名" }, "portProtocol": { "network": "網路", "serial": "序列" }, "preferences": { - "additionalManagerURLs": "其他開發版管理器網址", + "additionalManagerURLs": "其他開發版管理員網址", "auth.audience": "OAuth2 受眾", "auth.clientID": "OAuth2 客户端 ID", "auth.domain": "OAuth2 網域", "auth.registerUri": "註冊新使用者的 URI", "automatic": "自動", - "board.certificates": "可上傳至開發版的憑證清單", + "board.certificates": "可上傳到開發版的憑証列表", "browse": "瀏覽", - "checkForUpdate": "接收有關 IDE、開發板和函式庫的可用更新通知, 預設為開啟。 更改設定後需要重新啟動 IDE 才會生效。", + "checkForUpdate": "接收 IDE、開發板和程式庫的更新通知。 更改後需要重啟 IDE。 預設:開啟。", "choose": "選取", - "cli.daemonDebug": "啟用對 Arduino CLI 的 gRPC 呼叫的除錯日誌記錄, 預設不啟用。若修改設定需要重新啟動 IDE 才能生效。", - "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.sketchSyncEndpoint": "用來從後台讀取或推送 sketch 的端點。預設: Arduino 雲 API。", "compile": "編譯", - "compile.experimental": "設為 True 表示 IDE 要處理多個編譯錯誤, 預設是 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 會輸出詳細編譯資訊, 預設為False", + "compile.experimental": "IDE 處理多個編譯器錯誤。 預設: 關閉", + "compile.revealRange": "調整驗證/上傳失敗後編譯器錯誤訊息如何顯示。 可能的值:'auto':依需要垂直滾動並顯示一行。 'center':依需要垂直滾動並顯示垂直居中的一行。 'top':依需要垂直滾動並上方顯示一行,方便查看程式碼。 'centerIfOutsideViewport':依需要垂直滾動,僅當它在可視區外時才顯示垂直居中的一行。 預設為 '{0}'", + "compile.verbose": "輸出詳細編譯資訊。預設: 關閉", "compile.warnings": "設定 gcc 警告等級, 預設為 'None'", "compilerWarnings": "編譯器警告", "editorFontSize": "編輯器字體大小", "editorQuickSuggestions": "編輯器快速建議", "enterAdditionalURLs": "輸入其他網址, 每列一個", - "files.inside.sketches": "顯示草稿碼中的檔案", + "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 Language Server 要在草稿碼的資料夾中產生日誌檔, 預設為 False。", - "language.realTimeDiagnostics": "設為 true 表示 Arduino Language Server 要在編輯器中打字時提供及時診斷, 預設為 false。", + "language.log": "Arduino語言伺服器會自動在 sketch 內產生日誌檔。預設為關閉。", + "language.realTimeDiagnostics": "語言服務器提供即時診斷。預設關閉。", "manualProxy": "手動設定代理伺服器", + "monitor": { + "dockPanel": "程式 _{0}_ 區塊位置. 不是在 \"下方\" 或 \"右側\". 預設: \"{1}\"." + }, "network": "網路", - "newSketchbookLocation": "選取新的草稿碼簿位置", - "noCliConfig": "無法載入 CLI 設定", + "newSketchbookLocation": "選取新的 sketchbook 位置", + "noCliConfig": "無法載入CLI 命令列設定。", "noProxy": "不使用代理伺服器", "proxySettings": { "hostname": "主機名稱", "password": "密碼", - "port": "連接埠編號", + "port": "埠號", "username": "使用者名稱" }, "showVerbose": "在以下階段顯示詳細輸出", "sketch": { - "inoBlueprint": "預設的 `.ino` 模版檔案的絕對路徑, 如果有設定, 會用來作為 IDE 建立新草稿碼時的模版;如果沒有指定, 就會以 Arduino 預設的內容產生新的草稿碼。如果指定的路徑無法存取, 就會忽略指定的樣版檔。**修改此設定需要重新啟動 IDE** 才會生效。" + "inoBlueprint": "\".ino \"藍圖文件的絕對檔案系統路徑。如有指定,藍圖文件的內容將被用在每個新增的 sketch 上。如果沒特別指定,sketch 將以內預設的Arduino內容生成。無法訪問的藍圖文件將被忽略。 **需要重啟 IDE** 本設定才會生效。" }, - "sketchbook.location": "草稿碼簿位置", - "sketchbook.showAllFiles": "設為 True 會顯示草稿碼內的所有檔案, 預設為 false。", - "survey.notification": "設為 true 會在有新的問卷時通知使用者, 預設為 true。", - "unofficialBoardSupport": "按一下可取得非官方支援開發板的網址的網址清單", + "sketchbook.location": "sketchbook 位置", + "sketchbook.showAllFiles": "顯示 sketch 內全部檔案。預設: false。", + "survey.notification": "有新問卷時會通知使用者, 預設為: true。", + "unofficialBoardSupport": "點擊來取得非官方開發版的支援網址", "upload": "上傳", - "upload.verbose": "設為 true 會在上傳時輸出詳細資訊, 預設是 false。", + "upload.verbose": "上傳時輸出的詳細資訊。預設: False", "verifyAfterUpload": "上傳後驗證程式碼", - "window.autoScale": "設為 true 會依據字體大小自動縮放使用者介面", + "window.autoScale": "使用者介面隨字體大小自動縮放。", "window.zoomLevel": { - "deprecationMessage": "已棄用, 请改用 \"window.zoomLevel\"。" + "deprecationMessage": "已棄用。請改用 'window.zoomLevel' 。" } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "雲 sketch 的新名稱" }, - "replaceMsg": "取代現有版本 {0}?", - "selectZip": "選擇包含你要加入的函式庫的 zip 檔", + "replaceMsg": "取代現有的 {0} 版本?", + "selectZip": "選擇內含程式庫的 zip 檔", "serial": { "autoscroll": "自動捲動", - "carriageReturn": "歸位", - "connecting": "Connecting to '{0}' on '{1}'...", - "message": "訊息 (按 Enter 將訊息發送連接到 {1} 的 {0})", + "carriageReturn": "內有 CR", + "connecting": "連接到 '{1}' 上的 '{0}' ...", + "message": "訊息 (按 Enter 鍵將訊息發送到 {1} 上的 {0})", "newLine": "換行", - "newLineCarriageReturn": "換行加歸位", - "noLineEndings": "不加行結尾字元", - "notConnected": "沒有連接到開發板, 請選擇開發板與連接埠以便自動連接", - "openSerialPlotter": "序列埠繪圖家", + "newLineCarriageReturn": "NL和CR字元", + "noLineEndings": "沒有斷行字元", + "notConnected": "未連上。請選擇開發板及連接埠後自動連接", + "openSerialPlotter": "序列埠監控窗", "timestamp": "時間戳記", "toggleTimestamp": "切換是否加入時間戳記" }, "sketch": { - "archiveSketch": "將草稿碼歸檔", - "cantOpen": "\"{0}\" 資料夾已存在, 無法開啟草稿碼。", - "close": "確定要關閉草稿碼嗎?", - "compile": "正在編譯草稿碼...", + "archiveSketch": "sketch 歸檔", + "cantOpen": "已有 \"{0}\" 資料夾, 無法開啟 sketch", + "compile": "編譯 sketch...", "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.", + "editInvalidSketchFolderLocationQuestion": "想要把 sketch 儲存在不同地方嗎?", + "editInvalidSketchFolderQuestion": "想要把 sketch 存為不同檔名嗎?", + "exportBinary": "匯出已編譯的二進位碼", + "invalidCloudSketchName": "命名必須以字母、數字或底線開頭,後面接字母、數字、破折號、點、底線。最長 36個字元。", + "invalidSketchFolderLocationDetails": "不能把 sketch 儲存到它自身內部的資料夾裡。", + "invalidSketchFolderLocationMessage": "無效的 sketch 資料夾位置: '{0}' ", + "invalidSketchFolderNameMessage": "無效的 sketch 資料夾名稱: '{0}' ", + "invalidSketchName": "命名必須以字母、數字或底線為開頭,後面跟著字母、數字、破折號、點、底線。最長 63 字元。", "moving": "移動", - "movingMsg": "檔案{0}需要放在草稿碼資料夾內名稱為{1}的資料夾,\n要建立此資料夾, 搬移檔案再繼續嗎?", - "new": "建立新草稿碼", - "noTrailingPeriod": "A filename cannot end with a dot", + "movingMsg": "檔案{0}需放在sketch 資料夾的{1}內 ,\n要建立資料夾並移動檔案嗎?", + "new": "新增 sketch", + "noTrailingPeriod": "檔名不能以逗號字元結尾", "openFolder": "開啟資料夾", - "openRecent": "開啟最近的草稿碼", - "openSketchInNewWindow": "在新視窗開啟草稿碼", - "reservedFilename": "'{0}' is a reserved filename.", - "saveFolderAs": "將草稿碼簿另存為...", - "saveSketch": "儲存草稿碼以便之後可以再開啟", - "saveSketchAs": " 將草稿碼簿另存為...", - "showFolder": "開啟草稿碼簿資料夾", - "sketch": "草稿碼", - "sketchbook": "草稿碼簿", - "titleLocalSketchbook": "本地的草稿碼簿", - "titleSketchbook": "草稿碼簿", + "openRecent": "開啟最近的", + "openSketchInNewWindow": "在新視窗開啟 sketch", + "reservedFilename": "'{0}' 為保留檔名。", + "saveFolderAs": "另存 Sketch 資料夾為", + "saveSketch": "儲存 sketch 以便下次再打開它。", + "saveSketchAs": "另存 Sketch 資料夾為", + "showFolder": "顯示 Sketch 資料夾", + "sketch": "Sketch", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "本地端的 Sketchbook", + "titleSketchbook": "Sketchbook", "upload": "上傳", "uploadUsingProgrammer": "使用燒錄器上傳", "uploading": "正在上傳...", - "userFieldsNotFoundError": "Can't find user fields for connected board", + "userFieldsNotFoundError": "找不到已連接開發版中的用戶欄", "verify": "驗證", "verifyOrCompile": "驗證/編譯" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "建立新草稿碼" + "newCloudSketch": "新增雲 sketch", + "newSketch": "新增 sketch" }, "survey": { - "answerSurvey": "回覆問卷", + "answerSurvey": "填寫問卷", "dismissSurvey": "不要再顯示", - "surveyMessage": "請回答這個超簡短的問卷來幫助我們改進, 我們很重視社群,也希望能多了解我們的支持者。" + "surveyMessage": "請回答超短的問卷來協助我們改善。 我們重視本社群, 希望能更了解我們的支持者。 " }, "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": "High Contrast", - "light": "Light", - "user": "{0} (user)" + "currentThemeNotFound": "找不到目前選擇的主題:{0} 。 Arduino IDE 挑選了一個內建的相容主題。", + "dark": "暗色", + "deprecated": "{0} (已棄用)", + "hc": "深色高對比", + "hcLight": "亮色高對比", + "light": "亮色", + "user": "{0} (使用者)" }, "title": { - "cloud": "Cloud" + "cloud": "雲端" }, "updateIndexes": { "updateIndexes": "更新索引", - "updateLibraryIndex": "更新函式庫索引", + "updateLibraryIndex": "更新程式庫索引", "updatePackageIndex": "更新套件索引" }, "upload": { @@ -499,40 +505,40 @@ "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" + "abortFixMessage": "Sketch 仍是無效的。你想修復這問題嗎?點擊 '{0}' ,會開啟新的 Sketch 。", + "abortFixTitle": "無效的 sketch", + "renameSketchFileMessage": "Sketch '{0}' 無法被使用。 {1} 想立即更改 sketch 的檔名嗎?", + "renameSketchFileTitle": "無效的 sketch 檔名", + "renameSketchFolderMessage": "Sketch '{0}' 無法被使用。 {1} 要擺脫這則訊息,請更改 sketch 檔名。要現在更改檔名嗎?", + "renameSketchFolderTitle": "無效的 sketch 檔名" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}'已存在。" } }, "theia": { "core": { - "cannotConnectBackend": "無法連接後端", - "cannotConnectDaemon": "無法連線到 CLI 背景服務程式", - "couldNotSave": "無法儲存草稿, 請先將尚未存檔的內容複製到慣用的文字編輯器中, 再重新啟動 IDE。", - "daemonOffline": "CLI 背景服務程式離線", + "cannotConnectBackend": "無法連上後端", + "cannotConnectDaemon": "無法連上命令列 CLI 背景程式", + "couldNotSave": "無法儲存 sketch,請複製未存檔的成果到你偏好的文字編輯器中, 再重啟 IDE", + "daemonOffline": "CLI 命令列背景程式離線", "offline": "離線", "offlineText": "離線", - "quitTitle": "你確定要退出嗎?" + "quitTitle": "確定要退出嗎?" }, "editor": { "unsavedTitle": "{0} – 尚未儲存" }, "messages": { - "collapse": "收和", + "collapse": "收折", "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": "新檔案的名稱", + "deleteCloudSketch": "雲 sketch '{0}' 將從Arduino 伺服器和本機暫存中永久刪除。這個動作是不可逆的。確定要刪除 Sketch 嗎?", + "deleteCurrentSketch": "sketch '{0}' 將被永久刪除。這個動作是不可逆的。確定要刪除 sketch 嗎?", + "fileNewName": "新檔案名稱", "invalidExtension": ".{0} 不是符合規則的副檔名", - "newFileName": "新檔名" + "newFileName": "新檔案名稱" } } } diff --git a/i18n/zh.json b/i18n/zh.json index d68eff8ab..17e66f32e 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -8,7 +8,7 @@ "goToCloudEditor": "转到云编辑器", "goToIoTCloud": "转到物联网云", "goToProfile": "转到个人资料", - "menuTitle": "Arduino 云" + "menuTitle": "Arduino Cloud" }, "board": { "board": "开发板 {0}", @@ -18,24 +18,21 @@ "configDialog1": "如果要上传项目,请选择开发板和端口。", "configDialog2": "如果你只选择了开发板,你可以编译项目,但不能上传项目。", "couldNotFindPreviouslySelected": "在安装的平台 ‘{1}’ 中找不到以前选择的开发板 ‘{0}’。请手动选择要使用的开发板。你想现在重新选择它吗?", - "disconnected": "已断开", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "获得开发板信息", "inSketchbook": "(在项目文件夹中)", "installNow": "必须为当前选定的 {2} 开发板板安装 “{0}{1}” 内核。你想现在安装吗?", "noBoardsFound": "没有找到 “{0}” 相关开发板", - "noFQBN": "FQBN 不可用于所选开发板 “{0}”。你是否安装了相应的内核?", "noNativeSerialPort": "本地串行端口,无法获取信息。", "noPortsDiscovered": "未发现端口", - "noPortsSelected": "没有为开发板选择端口:‘{0}’。", "nonSerialPort": "非串行端口,无法获取信息。", - "noneSelected": "未选择任何开发板。", "openBoardsConfig": "选择其他开发板和接口......", "pleasePickBoard": "请选择要连接的开发板。", "port": "端口 {0}", - "portLabel": "端口:{0}", "ports": "端口", "programmer": "编程器", "reselectLater": "稍后重新选择", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "搜索开发坂", "selectBoard": "选择开发板", "selectPortForInfo": "请选择一个端口以获取开发板信息。", @@ -44,6 +41,7 @@ "succesfullyInstalledPlatform": "已成功安装平台 {0}:{1}", "succesfullyUninstalledPlatform": "已成功卸载平台 {0}:{1}", "typeOfPorts": "{0} 端口", + "unconfirmedBoard": "Unconfirmed board", "unknownBoard": "未知开发板" }, "boardsManager": "开发板管理器", @@ -215,6 +213,11 @@ "optimizeForDebugging": "调试优化", "sketchIsNotCompiled": "项目 '{0}' 在开始调试会话之前必须经过验证。请验证草图并重新开始调试。你现在要验证草图吗?" }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" + }, "dialog": { "dontAskAgain": "不要再请求" }, @@ -230,10 +233,6 @@ "previousError": "上一个错误", "revealError": "显示错误" }, - "electron": { - "couldNotSave": "无法保存项目。请将未保存的工作复制到你喜爱的文本编辑器中,然后重新启动 IDE。", - "unsavedChanges": "将不会保存任何未保存的更改。" - }, "examples": { "builtInExamples": "内置示例", "couldNotInitializeExamples": "无法初始化内置示例。", @@ -251,7 +250,7 @@ "selectBoard": "选择开发板", "selectVersion": "选择固件版本", "successfullyInstalled": "固件成功安装", - "updater": "WiFi101 / WiFiNINA 固件更新程序" + "updater": "Firmware Updater" }, "help": { "environment": "环境", @@ -282,6 +281,10 @@ "updateAvailable": "IDE 可更新。", "versionDownloaded": "Arduino IDE {0} 已经下载。" }, + "installable": { + "libraryInstallFailed": "Failed to install library: '{0}{1}'.", + "platformInstallFailed": "Failed to install platform: '{0}{1}'." + }, "library": { "addZip": "添加 .ZIP 库...", "arduinoLibraries": "Arduino 库", @@ -381,6 +384,9 @@ "language.log": "True 则 Arduino Language Server 将日志文件生成到项目文件夹中。默认为 False。", "language.realTimeDiagnostics": " True 则 language server 在编辑器中输入时提供实时诊断。默认为 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 配置", @@ -415,7 +421,7 @@ "serial": { "autoscroll": "自动滚屏", "carriageReturn": "回车", - "connecting": "Connecting to '{0}' on '{1}'...", + "connecting": "在 '{1}' 上连接至 '{0}' 中……", "message": "消息(按回车将消息发送到“{1}”上的“{0}”)", "newLine": "换行", "newLineCarriageReturn": "换行 和 回车 两者都是", @@ -428,7 +434,6 @@ "sketch": { "archiveSketch": "项目存档", "cantOpen": "“{0}” 文件夹已存在。无法打开项目。", - "close": "是否确实要关闭项目?", "compile": "正在编译项目…", "configureAndUpload": "配置并上传", "createdArchive": "已创建存档 ‘{0}’。", @@ -475,12 +480,13 @@ "surveyMessage": "请回答这份很短的调查来帮助我们改进。我们重视我们的社区,也希望能够更好地了解我们的支持者。" }, "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": "High Contrast", - "light": "Light", - "user": "{0} (user)" + "currentThemeNotFound": "找不到当前选中的主题:{0}。Arduino IDE 已选择一个与缺失者兼容的内置主题。", + "dark": "暗黑", + "deprecated": "{0} (已弃用)", + "hc": "Dark High Contrast", + "hcLight": "Light High Contrast", + "light": "明亮", + "user": "{0}(用户)" }, "title": { "cloud": "云" diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index f39db000d..45d9297f4 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -1,226 +1,229 @@ { "arduino": { "about": { - "detail": "Version: {0}\nDate: {1}{2}\nCLI Version: {3}\n\n{4}", + "detail": "版本: {0}\n日期: {1}{2}\nCLI 版本: {3}\n\n{4}", "label": "關於 {0}" }, "account": { - "goToCloudEditor": "Go to Cloud Editor", - "goToIoTCloud": "Go to IoT Cloud", - "goToProfile": "Go to Profile", - "menuTitle": "Arduino Cloud" + "goToCloudEditor": "前往雲端編輯器", + "goToIoTCloud": "前往物聯網雲", + "goToProfile": "到個人資訊", + "menuTitle": "Arduino雲" }, "board": { "board": "{0} 開發板", "boardConfigDialogTitle": "選擇其他開發板和埠", "boardInfo": "開發板資訊", - "boards": "boards", - "configDialog1": "若要上傳 Sketch 請選擇一片板子及一個埠", - "configDialog2": "如果你只有選擇板子你可以編譯,但不能上傳 Sketch", - "couldNotFindPreviouslySelected": "在安装的平台{1}中找不到以前選擇的開發板{0}。請手動選擇要使用的開發板。你想現在重新選擇它吗?", - "disconnected": "斷開連接", + "boards": "開發版", + "configDialog1": "若要上傳 Sketch 請選擇開發板及埠", + "configDialog2": "單選擇開發板只能編譯,不能上傳", + "couldNotFindPreviouslySelected": "已安装平台{1}中找不到您選的開發板{0}。請手動選擇。你想選擇嗎?", + "editBoardsConfig": "Edit Board and Port...", "getBoardInfo": "取得開發板資訊", - "inSketchbook": "(在草稿資料夾中)", - "installNow": "必須為目前選定的 {2} 開發板安裝 {0} {1} 核心程式,你要現在安裝嗎?", - "noBoardsFound": "未找到開發板 {0}", - "noFQBN": "FQBN無法用於所選擇的\"{0}\"開發版。你是否安裝了對應的核心?", - "noNativeSerialPort": "Native serial port, can't obtain info.", - "noPortsDiscovered": "未找到埠", - "noPortsSelected": "沒有選到 '{0}' 板的埠", - "nonSerialPort": "Non-serial port, can't obtain info.", - "noneSelected": "沒有選擇電路板", - "openBoardsConfig": "選擇其他的電路板或埠...", - "pleasePickBoard": "請選擇要連接的開發版", - "port": "{0} 埠", - "portLabel": "端口: {0}", - "ports": "ports", + "inSketchbook": "(在 sketchbook 內)", + "installNow": "選取的 {2} 開發板必須安裝 {0} {1} 核心程式,要現在安裝嗎?", + "noBoardsFound": "開發板 {0} 未找到", + "noNativeSerialPort": "無法獲得序列埠的資訊。", + "noPortsDiscovered": "未找到連接埠", + "nonSerialPort": "非序列埠,無法取得資訊。", + "openBoardsConfig": "選擇其他開發板及連接埠", + "pleasePickBoard": "請選擇已連接上的開發版", + "port": "連接埠: {0}", + "ports": "連接埠", "programmer": "燒錄器", - "reselectLater": "請稍後在選擇", + "reselectLater": "請稍後再選擇", + "revertBoardsConfig": "Use '{0}' discovered on '{1}'", "searchBoard": "搜尋開發板", "selectBoard": "選擇開發版", - "selectPortForInfo": "請選定一個埠,以便能取得板子的資訊", + "selectPortForInfo": "請選定連接埠以便取得開發板的資訊", "showAllAvailablePorts": "當開啟時,顯示所有可用的埠", - "showAllPorts": "Show all ports", - "succesfullyInstalledPlatform": "已成功卸载平台 {0}:{1}", - "succesfullyUninstalledPlatform": "平台已成功移除 {0}:{1}", - "typeOfPorts": "{0} ports", - "unknownBoard": "Unknown board" - }, - "boardsManager": "開發板管理器", + "showAllPorts": "顯示所有連接埠", + "succesfullyInstalledPlatform": "成功安裝平台 {0}:{1}", + "succesfullyUninstalledPlatform": "成功卸載平台 {0}:{1}", + "typeOfPorts": "{0}連接埠", + "unconfirmedBoard": "Unconfirmed board", + "unknownBoard": "未知的開發版" + }, + "boardsManager": "開發板管理員", "boardsType": { "arduinoCertified": "Arduino 認證" }, "bootloader": { "burnBootloader": "燒錄 Bootloader", - "burningBootloader": "正在燒錄引導程式...", + "burningBootloader": "正在燒錄 bootloader ...", "doneBurningBootloader": "Bootloader 燒錄完成" }, "burnBootloader": { - "error": "燒錄 {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": "檢查 Arduino 更新", - "installAll": "安裝所有", - "noUpdates": "沒有可用的最新更新。", - "promptUpdateBoards": "您的部分開發板有可用更新。", - "promptUpdateLibraries": "您的部分函數庫有可用更新。", + "installAll": "全部安裝", + "noUpdates": "没有更新版。", + "promptUpdateBoards": "部分開發板有更新檔。", + "promptUpdateLibraries": "部分程式庫有更新檔。", "updatingBoards": "更新開發板中...", - "updatingLibraries": "更新函數庫中..." + "updatingLibraries": "更新程式庫中..." }, "cli-error-parser": { - "keyboardError": "找不到 'Keyboard',請檢查項目是否包含 '#include '。", - "mouseError": "找不到 'Mouse',請檢查項目是否包含 '#include '。" + "keyboardError": "找不到 'Keyboard',請檢查是否缺少 '#include '。", + "mouseError": "找不到 'Mouse',請檢查是否缺少 '#include '。" }, "cloud": { - "chooseSketchVisibility": "選擇草稿的能見度:", - "cloudSketchbook": "雲端草稿資料夾", + "chooseSketchVisibility": "選擇 sketch 的透明度:", + "cloudSketchbook": "雲 sketchbook", "connected": "已連接", "continue": "繼續", - "donePulling": "Done pulling '{0}'.", - "donePushing": "Done pushing '{0}'.", + "donePulling": "已完成讀取 '{0}' 。", + "donePushing": "已完成推送 '{0}' 。", "embed": "嵌入:", - "emptySketchbook": "您的草稿資料夾是空的", - "goToCloud": "Go to Cloud", + "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": "遠端", "share": "分享...", - "shareSketch": "分享草稿", - "showHideSketchbook": "Show/Hide Cloud Sketchbook", + "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": "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..." + "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": "已貢獻", "installManually": "手動安裝", - "later": "稍後再說", + "later": "稍後", "noBoardSelected": "沒有選擇開發版", "notConnected": "[未連接]", "offlineIndicator": "您目前處於離線狀態,在沒有網路的情況下,Arduino命令列介面將無法下載需要的資源,並可能導致錯誤。請連接至網路並重新啟動程式。", - "oldFormat": "'{0}'仍然使用舊的 `.pde` 格式,是否要轉換至新的 `.ino` 擴充?", + "oldFormat": "'{0}'仍然使用舊的 `.pde` 格式,要切換成新版 `.ino` 嗎?", "partner": "合作夥伴", "processing": "資料處理中", "recommended": "推薦", - "retired": "不在支援", + "retired": "不再支援", "selectedOn": "在 {0}", - "serialMonitor": "序列埠監控", + "serialMonitor": "序列埠監控窗", "type": "類型", "unknown": "未知", "updateable": "可更新" }, "compile": { - "error": "{0} 編譯錯誤" + "error": "編譯錯誤:{0} " }, "component": { - "boardsIncluded": "包含在此包的開發版:", + "boardsIncluded": "本套件內建的開發版:", "by": "by", - "clickToOpen": "Click to open in browser: {0}", - "filterSearch": "過濾你的搜尋 ...", + "clickToOpen": "點擊以瀏覽器開啟:{0}", + "filterSearch": "篩選搜尋結果...", "install": "安裝", - "installLatest": "Install Latest", - "installVersion": "Install {0}", - "installed": "{0} installed", + "installLatest": "安装最新版本", + "installVersion": "安裝 {0}", + "installed": "{0}已安裝", "moreInfo": "更多資訊", - "otherVersions": "Other Versions", + "otherVersions": "其它版本", "remove": "移除", - "title": "{0} by {1}", - "uninstall": "移除安裝", - "uninstallMsg": "你要移除 {0}?", - "update": "Update" + "title": "{0} / {1}", + "uninstall": "卸載", + "uninstallMsg": "你要卸載 {0}?", + "update": "更新" }, "configuration": { "cli": { - "inaccessibleDirectory": "Could not access the sketchbook location at '{0}': {1}" + "inaccessibleDirectory": "無法存取 sketchbook 內的 '{0}' :{1}" } }, "connectionStatus": { - "connectionLost": "Connection lost. Cloud sketch actions and updates won't be available." + "connectionLost": "失去連線,無法使用雲 sketch 或更新。" }, "contributions": { "addFile": "加入檔案", - "fileAdded": "一個檔案加入到 Sketch", + "fileAdded": "一個檔案加入 Sketch", "plotter": { - "couldNotOpen": "Couldn't open serial plotter" + "couldNotOpen": "無法開啟繪圖儀。" }, - "replaceTitle": "替代" + "replaceTitle": "取代" }, "core": { "compilerWarnings": { - "all": "所有", - "default": "Default", - "more": "More", - "none": "None" + "all": "全部", + "default": "預設", + "more": "更多", + "none": "無" } }, "coreContribution": { "copyError": "複製錯誤訊息", - "noBoardSelected": "未選擇開發版。請從 工具 > 開發版 中選擇您的開發版" + "noBoardSelected": "未選取開發版。請從 工具 > 開發版 中選取開發版" }, - "createCloudCopy": "Push Sketch to Cloud", + "createCloudCopy": "推送 sketch 至雲端。", "daemon": { - "restart": "重啟進程", - "start": "開啟進程", - "stop": "關閉進程" + "restart": "重啟背景程式", + "start": "重啟背景程式", + "stop": "停止背景程式" }, "debug": { "debugWithMessage": "除錯 - {0}", "debuggingNotSupported": "'{0}'不支援除錯。", - "noPlatformInstalledFor": "未安裝'{0}'的平台", + "noPlatformInstalledFor": "平台未安裝給'{0}'", "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?" + "sketchIsNotCompiled": "Sketch '{0}' 在除錯前必須已驗證過。請先驗證 sketch 後再除錯。要現在驗證 sketch 嗎?" + }, + "developer": { + "clearBoardList": "Clear the Board List History", + "clearBoardsConfig": "Clear the Board and Port Selection", + "dumpBoardList": "Dump the Board List" }, "dialog": { - "dontAskAgain": "請勿再次請求" + "dontAskAgain": "不要再詢問" }, "editor": { - "autoFormat": "自動格式化", - "commentUncomment": "備註/取消備註", + "autoFormat": "自動格式", + "commentUncomment": "備註/撤除備註", "copyForForum": "複製到論壇(Markdowm)", "decreaseFontSize": "縮小字體", "decreaseIndent": "減少縮排", @@ -230,14 +233,10 @@ "previousError": "上一個錯誤", "revealError": "顯示錯誤" }, - "electron": { - "couldNotSave": "無法儲存草稿,請複製你未存檔的工作到你偏好的文字編輯器中並重新啟動 IDE 整合開發環境", - "unsavedChanges": "任何沒有儲存的修改將不會被儲存" - }, "examples": { "builtInExamples": "內建範例", "couldNotInitializeExamples": "無法初始內建的範例", - "customLibrary": "客製函式庫的範例", + "customLibrary": "客製程式庫的範例", "for": "{0} 的範例", "forAny": "適用各種開發板的範例", "menu": "範例" @@ -247,75 +246,79 @@ "failedInstall": "安裝失敗,請再試一次", "install": "安裝", "installingFirmware": "安裝韌體", - "overwriteSketch": "安裝將覆寫到板子上的 Sketch", + "overwriteSketch": "安裝將覆寫開發板上的 Sketch", "selectBoard": "選擇開發版", "selectVersion": "選擇韌體版本", - "successfullyInstalled": "成功安裝韌體", - "updater": "WiFi101 / WiFiNINA 韌體更新器" + "successfullyInstalled": "韌體安裝成功", + "updater": "Firmware 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": "檢查 Arduino IDE 最新版本", + "checkForUpdates": "檢查 Arduino IDE 更新", "closeAndInstallButton": "關閉並安裝。", - "closeToInstallNotice": "關閉軟體並安裝更新。", + "closeToInstallNotice": "關閉本程式後安裝更新。", "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": "貢獻函式庫", - "include": "含括函式庫", - "installAll": "安裝所有", - "installLibraryDependencies": "Install library dependencies", - "installMissingDependencies": "是否安裝所有缺少的附屬程式?", - "installOneMissingDependency": "是否安裝缺少的附屬程式?", - "installWithoutDependencies": "Install without dependencies", - "installedSuccessfully": "成功安裝 {0}:{1} 函式庫", - "libraryAlreadyExists": "函式庫已經存在,你要覆寫它嗎?", - "manageLibraries": "管理函式庫", - "namedLibraryAlreadyExists": "函式庫的資料夾名稱 {0} 已經存在,你要覆寫它嗎?", - "needsMultipleDependencies": "函式庫{0}:{1}需要一些未安装的附屬程式:", - "needsOneDependency": "函式庫{0}:{1}需要一些未安装的附屬程式:", - "overwriteExistingLibrary": "你要覆寫既有的函式庫嗎?", - "successfullyInstalledZipLibrary": "從 {0} 歸檔成功安裝函式庫", - "title": "函式庫管理器", - "uninstalledSuccessfully": "成功移除安裝的 {0}:{1} 函式庫", - "zipLibrary": "函式庫" + "addZip": "加入 .zip 程式庫 ...", + "arduinoLibraries": "Arduino 程式庫", + "contributedLibraries": "貢獻的程式庫", + "include": "含括程式庫", + "installAll": "全部安裝", + "installLibraryDependencies": "安裝相依的程式庫", + "installMissingDependencies": "要安裝缺少的相依程式嗎?", + "installOneMissingDependency": "要安裝缺少的相依程式庫嗎 ?", + "installWithoutDependencies": "不管相依性直接安裝", + "installedSuccessfully": "成功安裝程式庫 {0}:{1} ", + "libraryAlreadyExists": "程式庫已存在,要覆寫它嗎?", + "manageLibraries": "管理程式庫", + "namedLibraryAlreadyExists": "{0} 程式庫資料夾已存在,要覆寫它嗎?", + "needsMultipleDependencies": "程式庫{0}:{1}需要下列未安裝的相依程式:", + "needsOneDependency": "程式庫{0}:{1}需要其他未安装的相依程式:", + "overwriteExistingLibrary": "要覆寫既有的程式庫嗎?", + "successfullyInstalledZipLibrary": "從 {0} 成功安裝程式庫", + "title": "程式庫管理員", + "uninstalledSuccessfully": "成功卸載程式庫 {0}:{1}", + "zipLibrary": "程式庫" }, "librarySearchProperty": { "topic": "主題" }, "libraryTopic": { - "communication": "討論", + "communication": "交流", "dataProcessing": "資料處理", - "dataStorage": "資料存儲", + "dataStorage": "資料儲存", "deviceControl": "設備管理", "display": "顯示", "other": "其它", - "sensors": "傳感器", - "signalInputOutput": "信號輸入/輸出", + "sensors": "感測器", + "signalInputOutput": "訊號輸入/ 輸出", "timing": "定時", "uncategorized": "未分類" }, @@ -324,171 +327,174 @@ }, "menu": { "advanced": "進階設定", - "sketch": "草稿", + "sketch": "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": "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.", + "alreadyConnectedError": "已連線,但無法連到{0} {1}埠。", + "baudRate": "{0}鮑率", + "connectionFailedError": "無法連接 {0} {1} 埠。", + "connectionFailedErrorWithDetails": "{0} 無法連接 {1} {2} 埠。", + "connectionTimeout": "逾時,IDE在連上監看視窗後未收到成功訊息。", + "missingConfigurationError": "無法連上 {0} {1} 埠,監看視窗設定遺失。", + "notConnectedError": "無法連上 {0} {1} 埠。", "unableToCloseWebSocket": "無法關閉 websocket", - "unableToConnectToWebSocket": "無法連接到 websocket" + "unableToConnectToWebSocket": "無法連上 websocket" }, "newCloudSketch": { - "newSketchTitle": "Name of the new Cloud Sketch" + "newSketchTitle": "新的雲端 Sketch 名稱" }, "portProtocol": { "network": "網路", - "serial": "Serial" + "serial": "序列" }, "preferences": { "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": "接收有關 IDE、板和庫的可用更新的通知。 更改後需要重新啟動 IDE。 默認開啟。", + "checkForUpdate": "接收 IDE、開發板和程式庫的更新通知。 更改後需要重啟 IDE。 預設:開啟。", "choose": "選擇", - "cli.daemonDebug": "啟用對 Arduino CLI 的 gRPC 調用的調試日誌記錄。 此設置需要重新啟動 IDE 才能生效。 默認關閉。", - "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.sketchSyncEndpoint": "用來從後台讀取或推送 sketch 的端點。預設: Arduino 雲 API。", "compile": "編譯", - "compile.experimental": "開啟則 IDE 處理多個編譯器錯誤。 默認關閉", - "compile.revealRange": "調整驗證/上傳失敗後編譯器錯誤在編輯器中的顯示方式。 可能的值:'auto':根據需要垂直滾動並顯示一行。 'center':根據需要垂直滾動並顯示垂直居中的線條。 'top':根據需要垂直滾動並顯示靠近視口頂部的一行,針對查看代碼定義進行了優化。 'centerIfOutsideViewport':根據需要垂直滾動,僅當它位於視口之外時才顯示垂直居中的線。 默認為 '{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": "下載更新網址。默認為: '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.log": "Arduino語言伺服器會自動在 sketch 內產生日誌檔。預設為關閉。", + "language.realTimeDiagnostics": "語言服務器提供即時診斷。預設關閉。", + "manualProxy": "手動設定代理伺服器", + "monitor": { + "dockPanel": "程式 _{0}_ 區塊位置. 不是在 \"下方\" 或 \"右側\". 預設: \"{1}\"." + }, "network": "網路", - "newSketchbookLocation": "選取新的草稿資料夾位置", - "noCliConfig": "Could not load the CLI configuration", + "newSketchbookLocation": "選取新的 sketchbook 位置", + "noCliConfig": "無法載入CLI 命令列設定。", "noProxy": "無代理", "proxySettings": { - "hostname": "Host name", - "password": "Password", - "port": "Port number", - "username": "Username" + "hostname": "主機名稱", + "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." + "inoBlueprint": "\".ino \"藍圖文件的絕對檔案系統路徑。如有指定,藍圖文件的內容將被用在每個新增的 sketch 上。如果沒特別指定,sketch 將以內預設的Arduino內容生成。無法訪問的藍圖文件將被忽略。 **需要重啟 IDE** 本設定才會生效。" }, - "sketchbook.location": "草稿資料夾位置", - "sketchbook.showAllFiles": "True則顯示所有草稿中的草稿檔案。預設為false。", - "survey.notification": "True if users should be notified if a survey is available. True by default.", - "unofficialBoardSupport": "點擊以取得支援非官方開發版的網址列表", + "sketchbook.location": "sketchbook 位置", + "sketchbook.showAllFiles": "顯示 sketch 內全部檔案。預設: false。", + "survey.notification": "有新問卷時會通知使用者, 預設為: true。", + "unofficialBoardSupport": "點擊來取得非官方開發版的支援網址", "upload": "上傳", - "upload.verbose": "True則輸出詳細上傳資訊。預設為False", - "verifyAfterUpload": "上傳後驗證程式", - "window.autoScale": "True則使用者介面隨字體大小自動縮放。", + "upload.verbose": "上傳時輸出的詳細資訊。預設: False", + "verifyAfterUpload": "上傳後驗證程式碼", + "window.autoScale": "使用者介面隨字體大小自動縮放。", "window.zoomLevel": { - "deprecationMessage": "Deprecated. Use 'window.zoomLevel' instead." + "deprecationMessage": "已棄用。請改用 'window.zoomLevel' 。" } }, "renameCloudSketch": { - "renameSketchTitle": "New name of the Cloud Sketch" + "renameSketchTitle": "雲 sketch 的新名稱" }, - "replaceMsg": "取代 {0} 的現有版本?", - "selectZip": "選擇要加入函示庫的zip檔案", + "replaceMsg": "取代現有的 {0} 版本?", + "selectZip": "選擇內含程式庫的 zip 檔", "serial": { - "autoscroll": "自動滾頁面", - "carriageReturn": "回車", - "connecting": "Connecting to '{0}' on '{1}'...", - "message": "Message (Enter to send message to '{0}' on '{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": "編譯中...", - "configureAndUpload": "Configure and Upload", - "createdArchive": "已創建文件{0}。", + "archiveSketch": "sketch 歸檔", + "cantOpen": "已有 \"{0}\" 資料夾, 無法開啟 sketch", + "compile": "編譯 sketch...", + "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.", + "editInvalidSketchFolderLocationQuestion": "想要把 sketch 儲存在不同地方嗎?", + "editInvalidSketchFolderQuestion": "想要把 sketch 存為不同檔名嗎?", + "exportBinary": "匯出已編譯的二進位碼", + "invalidCloudSketchName": "命名必須以字母、數字或底線開頭,後面接字母、數字、破折號、點、底線。最長 36個字元。", + "invalidSketchFolderLocationDetails": "不能把 sketch 儲存到它自身內部的資料夾裡。", + "invalidSketchFolderLocationMessage": "無效的 sketch 資料夾位置: '{0}' ", + "invalidSketchFolderNameMessage": "無效的 sketch 資料夾名稱: '{0}' ", + "invalidSketchName": "命名必須以字母、數字或底線為開頭,後面跟著字母、數字、破折號、點、底線。最長 63 字元。", "moving": "移動", - "movingMsg": "\"{0}\"必須在命名為\"{1}\"的草稿資料夾中。建立這個資料夾,移動草稿並繼續?", - "new": "New Sketch", - "noTrailingPeriod": "A filename cannot end with a dot", + "movingMsg": "檔案{0}需放在sketch 資料夾的{1}內 ,\n要建立資料夾並移動檔案嗎?", + "new": "新增 sketch", + "noTrailingPeriod": "檔名不能以逗號字元結尾", "openFolder": "打開資料夾", "openRecent": "開啟最近的", - "openSketchInNewWindow": "在新視窗開啟草稿", - "reservedFilename": "'{0}' is a reserved filename.", - "saveFolderAs": "另存 Sketch 資料夾", - "saveSketch": "保存您的項目,以便以後再次打開它。", - "saveSketchAs": "另存 Sketch 資料夾", + "openSketchInNewWindow": "在新視窗開啟 sketch", + "reservedFilename": "'{0}' 為保留檔名。", + "saveFolderAs": "另存 Sketch 資料夾為", + "saveSketch": "儲存 sketch 以便下次再打開它。", + "saveSketchAs": "另存 Sketch 資料夾為", "showFolder": "顯示 Sketch 資料夾", - "sketch": "草稿", - "sketchbook": "草稿資料夾", - "titleLocalSketchbook": "本地草稿資料夾", - "titleSketchbook": "草稿資料夾", + "sketch": "Sketch", + "sketchbook": "Sketchbook", + "titleLocalSketchbook": "本地端的 Sketchbook", + "titleSketchbook": "Sketchbook", "upload": "上傳", "uploadUsingProgrammer": "使用燒錄器上傳", "uploading": "上傳...", - "userFieldsNotFoundError": "找不到已連接開發版中的用戶字段", + "userFieldsNotFoundError": "找不到已連接開發版中的用戶欄", "verify": "驗證", "verifyOrCompile": "驗證/編譯" }, "sketchbook": { - "newCloudSketch": "New Cloud Sketch", - "newSketch": "New Sketch" + "newCloudSketch": "新增雲 sketch", + "newSketch": "新增 sketch" }, "survey": { - "answerSurvey": "回覆問卷", + "answerSurvey": "填寫問卷", "dismissSurvey": "不要再顯示", - "surveyMessage": "請通過回答這個超簡短的調查來幫助我們改進。 我們重視我們的社群,並希望更好地了解我們的支持者。" + "surveyMessage": "請回答超短的問卷來協助我們改善。 我們重視本社群, 希望能更了解我們的支持者。 " }, "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": "High Contrast", - "light": "Light", - "user": "{0} (user)" + "currentThemeNotFound": "找不到目前選擇的主題:{0} 。 Arduino IDE 挑選了一個內建的相容主題。", + "dark": "暗", + "deprecated": "{0} (已棄用)", + "hc": "深色高對比", + "hcLight": "亮色高對比", + "light": "亮", + "user": "{0} (使用者)" }, "title": { - "cloud": "Cloud" + "cloud": "雲端" }, "updateIndexes": { - "updateIndexes": "Update Indexes", - "updateLibraryIndex": "Update Library Index", - "updatePackageIndex": "Update Package Index" + "updateIndexes": "更新索引", + "updateLibraryIndex": "更新程式庫索引", + "updatePackageIndex": "更新套件索引" }, "upload": { "error": "{0} 錯誤:{1}" @@ -499,40 +505,40 @@ "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" + "abortFixMessage": "Sketch 仍是無效的。你想修復這問題嗎?點擊 '{0}' ,會開啟新的 Sketch 。", + "abortFixTitle": "無效的 sketch", + "renameSketchFileMessage": "Sketch '{0}' 無法被使用。 {1} 想立即更改 sketch 的檔名嗎?", + "renameSketchFileTitle": "無效的 sketch 檔名", + "renameSketchFolderMessage": "Sketch '{0}' 無法被使用。 {1} 要擺脫這則訊息,請更改 sketch 檔名。要現在更改檔名嗎?", + "renameSketchFolderTitle": "無效的 sketch 檔名" }, "workspace": { - "alreadyExists": "'{0}' already exists." + "alreadyExists": "'{0}'已存在。" } }, "theia": { "core": { - "cannotConnectBackend": "無法連接後端", - "cannotConnectDaemon": "無法連接命令列 (CLI) 常駐程式", - "couldNotSave": "無法儲存草稿,請複製你未存檔的工作到你偏好的文字編輯器中並重新啟動 IDE 整合開發環境", - "daemonOffline": "CLI 命令列常駐程式離線", + "cannotConnectBackend": "無法連上後端", + "cannotConnectDaemon": "無法連上命令列 CLI 背景程式", + "couldNotSave": "無法儲存 sketch,請複製未存檔的成果到你偏好的文字編輯器中, 再重啟 IDE", + "daemonOffline": "CLI 命令列背景程式離線", "offline": "離線", "offlineText": "離線", - "quitTitle": "你確定要退出嗎?" + "quitTitle": "確定要退出嗎?" }, "editor": { "unsavedTitle": "{0} – 尚未儲存" }, "messages": { - "collapse": "崩潰", - "expand": "延伸" + "collapse": "收折", + "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": "給予檔案新名稱", + "deleteCloudSketch": "雲 sketch '{0}' 將從Arduino 伺服器和本機暫存中永久刪除。這個動作是不可逆的。確定要刪除 Sketch 嗎?", + "deleteCurrentSketch": "sketch '{0}' 將被永久刪除。這個動作是不可逆的。確定要刪除 sketch 嗎?", + "fileNewName": "新檔案名稱", "invalidExtension": ".{0} 不是合法的副檔名", - "newFileName": "給予檔案新名稱" + "newFileName": "新檔案名稱" } } } diff --git a/lerna.json b/lerna.json index 8c300cb7a..3b455fab5 100644 --- a/lerna.json +++ b/lerna.json @@ -1,7 +1,6 @@ { "lerna": "2.4.0", "version": "independent", - "useWorkspaces": true, "npmClient": "yarn", "command": { "run": { diff --git a/package.json b/package.json index 6b274847a..61113c1ea 100644 --- a/package.json +++ b/package.json @@ -1,51 +1,50 @@ { "name": "arduino-ide", - "version": "2.1.0", + "version": "2.2.0", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", "license": "AGPL-3.0-or-later", "private": true, "engines": { - "node": ">=16.0.0 <17" + "node": ">=16.14.0 <17" }, "devDependencies": { - "@theia/cli": "1.31.1", - "@types/jsdom": "^11.0.4", - "@types/sinon": "^2.3.5", - "@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.39.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", - "jsdom": "^11.5.1", - "lerna": "^6.1.0", + "lerna": "^7.1.4", "lint-staged": "^11.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", "semver": "^7.3.2", "style-dictionary": "^3.7.0", - "typescript": "~4.5.5", + "typescript": "^4.9.3", "xhr2": "^0.2.1" }, "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 ./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", "test:slow": "lerna run test:slow", - "download:plugins": "theia download:plugins", "update:version": "node ./scripts/update-version.js", "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", @@ -68,29 +67,5 @@ "workspaces": [ "arduino-ide-extension", "electron-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.8.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://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.53.2/file/MS-CEINTL.vscode-language-pack-cs-1.53.2.vsix", - "vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.53.2/file/MS-CEINTL.vscode-language-pack-de-1.53.2.vsix", - "vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.53.2/file/MS-CEINTL.vscode-language-pack-es-1.53.2.vsix", - "vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.53.2/file/MS-CEINTL.vscode-language-pack-fr-1.53.2.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.53.2/file/MS-CEINTL.vscode-language-pack-it-1.53.2.vsix", - "vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.53.2/file/MS-CEINTL.vscode-language-pack-ja-1.53.2.vsix", - "vscode-language-pack-ko": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ko/1.53.2/file/MS-CEINTL.vscode-language-pack-ko-1.53.2.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.53.2/file/MS-CEINTL.vscode-language-pack-pl-1.53.2.vsix", - "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.53.2/file/MS-CEINTL.vscode-language-pack-pt-BR-1.53.2.vsix", - "vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.53.2/file/MS-CEINTL.vscode-language-pack-ru-1.53.2.vsix", - "vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.53.2/file/MS-CEINTL.vscode-language-pack-tr-1.53.2.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.53.2/file/MS-CEINTL.vscode-language-pack-zh-hans-1.53.2.vsix" - } + ] } diff --git a/scripts/i18n/transifex-pull.js b/scripts/i18n/transifex-pull.js index e620e88da..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()); @@ -60,13 +60,14 @@ const getTranslationDownloadStatus = async (language, downloadRequestId) => { 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/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/yarn.lock b/yarn.lock index 44833b671..64517dd61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,413 +2,299 @@ # 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", "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-min@^1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/7zip-min/-/7zip-min-1.4.4.tgz#82a50a8d3f0a2d86b4c908433c9ec35627f4138c" + integrity sha512-mYB1WW5tcXfZxUN4+2joKk4+6j8jp+mpO2YiMU5z1gNNFbACxI2ADasffsdNPovZSwn/E662ZIH5gRkFPMufmA== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" + "7zip-bin" "5.1.1" + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@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.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@babel/highlight" "^7.10.4" + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== +"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== "@babel/core@^7.10.0": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" - integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" + json5 "^2.2.2" + semver "^6.3.1" -"@babel/generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" - integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== +"@babel/generator@^7.22.7", "@babel/generator@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" - integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" - integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c" - integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" - -"@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== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz#c36ea240bb3348f942f08b0fbe28d6d979fab236" + integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" + integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz#af1429c4a83ac316a6a8c2cc8ff45cb5d2998d3a" + integrity sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A== 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.18.6", "@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== dependencies: - "@babel/types" "^7.18.6" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" -"@babel/helper-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" - integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.5" -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@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.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz#189937248c45b0182c1dcf32f3444ca153944cb9" + integrity sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== dependencies: - "@babel/types" "^7.18.9" - -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" - integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@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.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" - integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== - -"@babel/helper-remap-async-to-generator@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" - integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" - integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== - dependencies: - "@babel/types" "^7.18.9" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-validator-identifier@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" - integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helper-wrap-function@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz#ae1feddc6ebbaa2fd79346b77821c3bd73a39646" - integrity sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ== - dependencies: - "@babel/helper-function-name" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helpers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" - integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== - dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.18.6", "@babel/parser@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" - integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== +"@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - 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.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + 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.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" -"@babel/plugin-proposal-async-generator-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz#aedac81e6fc12bb643374656dd5f2605bf743d17" - integrity sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w== - dependencies: - "@babel/helper-environment-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" +"@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-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" - integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.8" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== @@ -451,12 +337,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" - integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -465,13 +365,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.17.12": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@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" @@ -528,302 +421,434 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.18.6": +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + 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-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-async-generator-functions@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz#053e76c0a903b72b573cb1ab7d6882174d460a1b" + integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" - integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da" - integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-replace-supers" "^7.18.9" - "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292" - integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA== +"@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21" - integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" - integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-systemjs@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06" - integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A== +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-validator-identifier" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d" - integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg== +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-parameters@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" - integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz#4bacfe37001fe1901117672875e931d439811564" + integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.10.0": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.9.tgz#d9e4b1b25719307bfafbf43065ed7fb3a83adb8f" - integrity sha512-wS8uJwBt7/b/mzE13ktsJdmS4JP/j7PQSaADtnb4I2wL0zK51MQ0pmF8/Jy0wUIS96fr+fXT6S/ifiPXnvrlSg== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.9" - babel-plugin-polyfill-corejs2 "^0.3.1" - babel-plugin-polyfill-corejs3 "^0.5.2" - babel-plugin-polyfill-regenerator "^0.3.1" - semver "^6.3.0" + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz#a87b11e170cbbfb018e6a2bf91f5c6e533b9e027" + integrity sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664" - integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA== +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz#0d01fb7fb2243ae1c033f65f6e3b4be78db75f27" - integrity sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw== +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.10.0": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.9.tgz#9b3425140d724fbe590322017466580844c7eaff" - integrity sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.18.6" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.18.9" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.9.tgz#57f17108eb5dfd4c5c25a44c1977eba1df310ac7" + integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@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-import-assertions" "^7.18.6" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@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" @@ -833,45 +858,62 @@ "@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.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.18.9" - "@babel/plugin-transform-classes" "^7.18.9" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.18.9" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.18.6" - "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.18.9" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.18.8" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.18.9" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.6" - "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.18.9" - babel-plugin-polyfill-corejs2 "^0.3.1" - babel-plugin-polyfill-corejs3 "^0.5.2" - babel-plugin-polyfill-regenerator "^0.3.1" - core-js-compat "^3.22.1" - semver "^6.3.0" + "@babel/types" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + core-js-compat "^3.31.0" + semver "^6.3.1" "@babel/preset-modules@^0.1.5": version "0.1.5" @@ -884,74 +926,65 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" - integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.0.tgz#824a9ef325ffde6f78056059db3168c08785e24a" - integrity sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q== - dependencies: - regenerator-runtime "^0.13.10" - -"@babel/template@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" - integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.9" - "@babel/types" "^7.18.9" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@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.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.4.4": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f" - integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== +"@babel/types@^7.22.5", "@babel/types@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" +"@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.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== - dependencies: - debug "^4.1.1" - env-paths "^2.2.0" - fs-extra "^8.1.0" - got "^9.6.0" - 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/get@^2.0.0": version "2.0.2" resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.2.tgz#ae2a967b22075e9c25aaf00d5941cd79c21efd7e" @@ -967,911 +1000,297 @@ optionalDependencies: global-agent "^3.0.0" -"@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== +"@electron/universal@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.2.1.tgz#3c2c4ff37063a4e9ab1e6ff57db0bc619bc82339" + integrity sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + asar "^3.1.0" + debug "^4.3.1" + dir-compare "^2.4.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" -"@emotion/babel-plugin@^11.10.5": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz#65fa6e1790ddc9e23cc22658a4c5dea423c55c3c" - integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA== +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== dependencies: "@babel/helper-module-imports" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.17.12" "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/serialize" "^1.1.1" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" 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.1.3" + stylis "4.2.0" -"@emotion/cache@^11.10.5", "@emotion/cache@^11.4.0": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" - integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== +"@emotion/cache@^11.11.0", "@emotion/cache@^11.4.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== dependencies: - "@emotion/memoize" "^0.8.0" - "@emotion/sheet" "^1.2.1" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - stylis "4.1.3" + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" -"@emotion/hash@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" - integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== "@emotion/react@^11.8.1": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.5.tgz#95fff612a5de1efa9c0d535384d3cfa115fe175d" - integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A== + version "11.11.1" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157" + integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.5" - "@emotion/cache" "^11.10.5" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" - integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== - dependencies: - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/unitless" "^0.8.0" - "@emotion/utils" "^1.2.0" - csstype "^3.0.2" - -"@emotion/sheet@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" - integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== - -"@emotion/unitless@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== - -"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" - integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== - -"@emotion/utils@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" - integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== - -"@emotion/weak-memoize@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" - integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== - -"@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== - 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" - -"@floating-ui/core@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.0.1.tgz#00e64d74e911602c8533957af0cce5af6b2e93c8" - integrity sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA== - -"@floating-ui/dom@^1.0.1": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.0.3.tgz#b439c8a66436c2cae8d97e889f0b76cce757a6ec" - integrity sha512-6H1kwjkOZKabApNtXRiYHvMmYJToJ1DV7rQ3xc/WJpOABhQIOJJOdz2AOejj8X+gcybaFmBpisVTZxBZAM3V0w== - dependencies: - "@floating-ui/core" "^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.8" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.6.8.tgz#77cc8b2d841c34dea8b105d45ff1732caefae4f2" - integrity sha512-Nt5tufF/O5Q310kP0cDzxznWMZW58GCTZhUUiAQ9B0K0ANKNQ4Lj/K9XK0vZg+UBKq5/7z7+8mXHHfrcwoeFJQ== - dependencies: - "@grpc/proto-loader" "^0.7.0" - "@types/node" ">=12.12.47" - -"@grpc/proto-loader@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.0.tgz#743cc8a941cc251620c66ebe0d330e1411a33535" - integrity sha512-SGPZtVmqOvNfPFOA/nNPn+0Weqa5wubBgQ56+JgTbeLY2VezwtMjwPPFzh0kvQccwWT3a2TXT0ZGK/pJoOTk1A== - dependencies: - "@types/long" "^4.0.1" - lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^7.0.0" - yargs "^16.2.0" - -"@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== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^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== - -"@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== - -"@isaacs/string-locale-compare@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" - integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== - -"@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", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@emotion/serialize@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== - -"@lerna/add@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/add/-/add-6.1.0.tgz#0f09495c5e1af4c4f316344af34b6d1a91b15b19" - integrity sha512-f2cAeS1mE/p7QvSRn5TCgdUXw6QVbu8PeRxaTOxTThhTdJIWdXZfY00QjAsU6jw1PdYXK1qGUSwWOPkdR16mBg== - dependencies: - "@lerna/bootstrap" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/npm-conf" "6.1.0" - "@lerna/validation-error" "6.1.0" - dedent "^0.7.0" - npm-package-arg "8.1.1" - p-map "^4.0.0" - pacote "^13.6.1" - semver "^7.3.4" - -"@lerna/bootstrap@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-6.1.0.tgz#81738f32cd431814c9943dfffe28752587d90830" - integrity sha512-aDxKqgxexVj/Z0B1aPu7P1iPbPqhk1FPkl/iayCmPlkAh90pYEH0uVytGzi1hFB5iXEfG7Pa6azGQywUodx/1g== - dependencies: - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/has-npm-version" "6.1.0" - "@lerna/npm-install" "6.1.0" - "@lerna/package-graph" "6.1.0" - "@lerna/pulse-till-done" "6.1.0" - "@lerna/rimraf-dir" "6.1.0" - "@lerna/run-lifecycle" "6.1.0" - "@lerna/run-topologically" "6.1.0" - "@lerna/symlink-binary" "6.1.0" - "@lerna/symlink-dependencies" "6.1.0" - "@lerna/validation-error" "6.1.0" - "@npmcli/arborist" "5.3.0" - dedent "^0.7.0" - get-port "^5.1.1" - multimatch "^5.0.0" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - p-map "^4.0.0" - p-map-series "^2.1.0" - p-waterfall "^2.1.1" - semver "^7.3.4" - -"@lerna/changed@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-6.1.0.tgz#4fa480cbb0e7106ea9dad30d315e953975118d06" - integrity sha512-p7C2tf1scmvoUC1Osck/XIKVKXAQ8m8neL8/rfgKSYsvUVjsOB1LbF5HH1VUZntE6S4OxkRxUQGkAHVf5xrGqw== - dependencies: - "@lerna/collect-updates" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/listable" "6.1.0" - "@lerna/output" "6.1.0" - -"@lerna/check-working-tree@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-6.1.0.tgz#b8970fd27a26449b12456d5d0ece60477aa54e15" - integrity sha512-hSciDmRqsNPevMhAD+SYbnhjatdb7UUu9W8vTyGtUXkrq2xtRZU0vAOgqovV8meirRkbC41pZePYKqyQtF0y3w== - dependencies: - "@lerna/collect-uncommitted" "6.1.0" - "@lerna/describe-ref" "6.1.0" - "@lerna/validation-error" "6.1.0" - -"@lerna/child-process@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-6.1.0.tgz#6361f7945cd5b36e983f819de3cd91c315707302" - integrity sha512-jhr3sCFeps6Y15SCrWEPvqE64i+QLOTSh+OzxlziCBf7ZEUu7sF0yA4n5bAqw8j43yCKhhjkf/ZLYxZe+pnl3Q== - dependencies: - chalk "^4.1.0" - execa "^5.0.0" - strong-log-transformer "^2.1.0" - -"@lerna/clean@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-6.1.0.tgz#1114fd90ad82438123726e2493d3550e73abebbc" - integrity sha512-LRK2hiNUiBhPe5tmJiefOVpkaX2Yob0rp15IFNIbuteRWUJg0oERFQo62WvnxwElfzKSOhr8OGuEq/vN4bMrRA== - dependencies: - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/prompt" "6.1.0" - "@lerna/pulse-till-done" "6.1.0" - "@lerna/rimraf-dir" "6.1.0" - p-map "^4.0.0" - p-map-series "^2.1.0" - p-waterfall "^2.1.1" - -"@lerna/cli@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-6.1.0.tgz#41214331fa4c1ea5f41125befdd81b009fe12640" - integrity sha512-p4G/OSPIrHiNkEl8bXrQdFOh4ORAZp2+ljvbXmAxpdf2qmopaUdr+bZYtIAxd+Z42SxRnDNz9IEyR0kOsARRQQ== - dependencies: - "@lerna/global-options" "6.1.0" - dedent "^0.7.0" - npmlog "^6.0.2" - yargs "^16.2.0" - -"@lerna/collect-uncommitted@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-6.1.0.tgz#b6ffd7adda24d73b70304210967d3518caa3529d" - integrity sha512-VvWvqDZG+OiF4PwV4Ro695r3+8ty4w+11Bnq8tbsbu5gq8qZiam8Fkc/TQLuNNqP0SPi4qmMPaIzWvSze3SmDg== - dependencies: - "@lerna/child-process" "6.1.0" - chalk "^4.1.0" - npmlog "^6.0.2" - -"@lerna/collect-updates@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-6.1.0.tgz#75fcc0733b5a9ac318a6484b890aa4061b7859c2" - integrity sha512-dgH7kgstwCXFctylQ4cxuCmhwSIE6VJZfHdh2bOaLuncs6ATMErKWN/mVuFHuUWEqPDRyy5Ky40Cu9S40nUq5w== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/describe-ref" "6.1.0" - minimatch "^3.0.4" - npmlog "^6.0.2" - slash "^3.0.0" - -"@lerna/command@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/command/-/command-6.1.0.tgz#bcb12516f2c181822b3b5be46c18eadc9b61e885" - integrity sha512-OnMqBDaEBY0C8v9CXIWFbGGKgsiUtZrnKVvQRbupMSZDKMpVGWIUd3X98Is9j9MAmk1ynhBMWE9Fwai5ML/mcA== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/package-graph" "6.1.0" - "@lerna/project" "6.1.0" - "@lerna/validation-error" "6.1.0" - "@lerna/write-log-file" "6.1.0" - clone-deep "^4.0.1" - dedent "^0.7.0" - execa "^5.0.0" - is-ci "^2.0.0" - npmlog "^6.0.2" - -"@lerna/conventional-commits@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-6.1.0.tgz#1157bb66d84d48880dc5c5026d743cedf0f47094" - integrity sha512-Tipo3cVr8mNVca4btzrCIzct59ZJWERT8/ZCZ/TQWuI4huUJZs6LRofLtB0xsGJAVZ7Vz2WRXAeH4XYgeUxutQ== - dependencies: - "@lerna/validation-error" "6.1.0" - conventional-changelog-angular "^5.0.12" - conventional-changelog-core "^4.2.4" - conventional-recommended-bump "^6.1.0" - fs-extra "^9.1.0" - get-stream "^6.0.0" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - pify "^5.0.0" - semver "^7.3.4" - -"@lerna/create-symlink@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-6.1.0.tgz#d4260831f5d10abc0c70f0a8f39bea91db87e640" - integrity sha512-ulMa5OUJEwEWBHSgCUNGxrcsJllq1YMYWqhufvIigmMPJ0Zv3TV1Hha5i2MsqLJAakxtW0pNuwdutkUTtUdgxQ== - dependencies: - cmd-shim "^5.0.0" - fs-extra "^9.1.0" - npmlog "^6.0.2" - -"@lerna/create@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-6.1.0.tgz#cde219da46a7c5062c558366b4ffce2134f13845" - integrity sha512-ZqlknXu0L29cV5mcfNgBLl+1RbKTWmNk8mj545zgXc7qQDgmrY+EVvrs8Cirey8C7bBpVkzP7Brzze0MSoB4rQ== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/npm-conf" "6.1.0" - "@lerna/validation-error" "6.1.0" - dedent "^0.7.0" - fs-extra "^9.1.0" - init-package-json "^3.0.2" - npm-package-arg "8.1.1" - p-reduce "^2.1.0" - pacote "^13.6.1" - pify "^5.0.0" - semver "^7.3.4" - slash "^3.0.0" - validate-npm-package-license "^3.0.4" - validate-npm-package-name "^4.0.0" - yargs-parser "20.2.4" - -"@lerna/describe-ref@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-6.1.0.tgz#60f0b8297b912aa5fe5e6ab8ef6c4127813681a7" - integrity sha512-0RQAYnxBaMz1SrEb/rhfR+8VeZx5tvCNYKRee5oXIDZdQ2c6/EPyrKCp3WcqiuOWY50SfGOVfxJEcxpK8Y3FNA== - dependencies: - "@lerna/child-process" "6.1.0" - npmlog "^6.0.2" - -"@lerna/diff@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-6.1.0.tgz#bfa9bc35894d88a33fa0a3a5787082dea45d8cb2" - integrity sha512-GhP+jPDbcp9QcAMSAjFn4lzM8MKpLR1yt5jll+zUD831U1sL0I5t8HUosFroe5MoRNffEL/jHuI3SbC3jjqWjQ== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/validation-error" "6.1.0" - npmlog "^6.0.2" - -"@lerna/exec@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-6.1.0.tgz#a2d165576471ff61e33c49952d40a5dbc36fc78f" - integrity sha512-Ej6WlPHXLF6hZHsfD+J/dxeuTrnc0HIfIXR1DU//msHW5RNCdi9+I7StwreCAQH/dLEsdBjPg5chNmuj2JLQRg== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/profiler" "6.1.0" - "@lerna/run-topologically" "6.1.0" - "@lerna/validation-error" "6.1.0" - p-map "^4.0.0" - -"@lerna/filter-options@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-6.1.0.tgz#f4ee65d0db0273ce490ce6c72c9dbb1d23268ca6" - integrity sha512-kPf92Z7uLsR6MUiXnyXWebaUWArLa15wLfpfTwIp5H3MNk1lTbuG7QnrxE7OxQj+ozFmBvXeV9fuwfLsYTfmOw== - dependencies: - "@lerna/collect-updates" "6.1.0" - "@lerna/filter-packages" "6.1.0" - dedent "^0.7.0" - npmlog "^6.0.2" - -"@lerna/filter-packages@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-6.1.0.tgz#1ddac63a6ffdf5f058d206be5adfb39ad7aaf4f9" - integrity sha512-zW2avsZHs/ITE/37AEMhegGVHjiD0rgNk9bguNDfz6zaPa90UaW6PWDH6Tf4ThPRlbkl2Go48N3bFYHYSJKbcw== - dependencies: - "@lerna/validation-error" "6.1.0" - multimatch "^5.0.0" - npmlog "^6.0.2" - -"@lerna/get-npm-exec-opts@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-6.1.0.tgz#22351e2ebc4adbef21ca4b86187278e15e4cb38a" - integrity sha512-10Pdf+W0z7RT34o0SWlf+WVzz2/WbnTIJ1tQqXvXx6soj2L/xGLhOPvhJiKNtl4WlvUiO/zQ91yb83ESP4TZaA== - dependencies: - npmlog "^6.0.2" - -"@lerna/get-packed@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-6.1.0.tgz#b6d1c1dd1e068212e784b8dfc2e5fe64741ea8db" - integrity sha512-lg0wPpV0wPekcD0mebJp619hMxsOgbZDOH5AkL/bCR217391eha0iPhQ0dU/G0Smd2vv6Cg443+J5QdI4LGRTg== - dependencies: - fs-extra "^9.1.0" - ssri "^9.0.1" - tar "^6.1.0" - -"@lerna/github-client@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-6.1.0.tgz#cd33743e4529a0b822ae6716cb4b981e1d8ffe8f" - integrity sha512-+/4PtDgsjt0VRRZtOCN2Piyu0asU/16gSZZy/opVb8dlT44lTrH/ZghrJLE4tSL8Nuv688kx0kSgbUG8BY54jQ== - dependencies: - "@lerna/child-process" "6.1.0" - "@octokit/plugin-enterprise-rest" "^6.0.1" - "@octokit/rest" "^19.0.3" - git-url-parse "^13.1.0" - npmlog "^6.0.2" - -"@lerna/gitlab-client@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-6.1.0.tgz#bbcbf80d937e5980798ac1e0edd1f769101057d8" - integrity sha512-fUI/ppXzxJafN9ceSl+FDgsYvu3iTsO6UW0WTD63pS32CfM+PiCryLQHzuc4RkyVW8WQH3aCR/GbaKCqbu52bw== - dependencies: - node-fetch "^2.6.1" - npmlog "^6.0.2" - -"@lerna/global-options@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-6.1.0.tgz#268e1de924369102e47babd9288086764ec6f9e6" - integrity sha512-1OyJ/N1XJh3ZAy8S20c6th9C4yBm/k3bRIdC+z0XxpDaHwfNt8mT9kUIDt6AIFCUvVKjSwnIsMHwhzXqBnwYSA== - -"@lerna/has-npm-version@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-6.1.0.tgz#a5d960213d1a7ca5374eb3c551a17b322b9a9e62" - integrity sha512-up5PVuP6BmKQ5/UgH/t2c5B1q4HhjwW3/bqbNayX6V0qNz8OijnMYvEUbxFk8fOdeN41qVnhAk0Tb5kbdtYh2A== - dependencies: - "@lerna/child-process" "6.1.0" - semver "^7.3.4" - -"@lerna/import@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/import/-/import-6.1.0.tgz#1c64281e3431c43c9cd140b66a6a51427afe7095" - integrity sha512-xsBhiKLUavATR32dAFL+WFY0yuab0hsM1eztKtRKk4wy7lSyxRfA5EIUcNCsLXx2xaDOKoMncCTXgNcpeYuqcQ== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/prompt" "6.1.0" - "@lerna/pulse-till-done" "6.1.0" - "@lerna/validation-error" "6.1.0" - dedent "^0.7.0" - fs-extra "^9.1.0" - p-map-series "^2.1.0" - -"@lerna/info@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/info/-/info-6.1.0.tgz#a5d66a9c1f18398dc020a6f6073c399013081587" - integrity sha512-CsrWdW/Wyb4kcvHSnrsm7KYWFvjUNItu+ryeyWBZJtWYQOv45jNmWix6j2L4/w1+mMlWMjsfLmBscg82UBrF5w== - dependencies: - "@lerna/command" "6.1.0" - "@lerna/output" "6.1.0" - envinfo "^7.7.4" - -"@lerna/init@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/init/-/init-6.1.0.tgz#b178775693b9c38c0f3fe3300eeb574cf76e0297" - integrity sha512-z8oUeVjn+FQYAtepAw6G47cGodLyBAyNoEjO3IsJjQLWE1yH3r83L2sjyD/EckgR3o2VTEzrKo4ArhxLp2mNmg== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/project" "6.1.0" - fs-extra "^9.1.0" - p-map "^4.0.0" - write-json-file "^4.3.0" - -"@lerna/link@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/link/-/link-6.1.0.tgz#f6f0cfd0b02aecdeb304ce614e4e4e89fe0a3ad5" - integrity sha512-7OD2lYNQHl6Kl1KYmplt8KoWjVHdiaqpYqwD38AwcB09YN58nGmo4aJgC12Fdx8DSNjkumgM0ROg/JOjMCTIzQ== - dependencies: - "@lerna/command" "6.1.0" - "@lerna/package-graph" "6.1.0" - "@lerna/symlink-dependencies" "6.1.0" - "@lerna/validation-error" "6.1.0" - p-map "^4.0.0" - slash "^3.0.0" - -"@lerna/list@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/list/-/list-6.1.0.tgz#a7625bceb5224c4bf1154e715c07ea29f9698bac" - integrity sha512-7/g2hjizkvVnBGpVm+qC7lUFGhZ/0GIMUbGQwnE6yXDGm8yP9aEcNVkU4JGrDWW+uIklf9oodnMHaLXd/FJe6Q== + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== dependencies: - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/listable" "6.1.0" - "@lerna/output" "6.1.0" - -"@lerna/listable@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-6.1.0.tgz#2510045fde7bc568b18172a5d24372a719bb5c4c" - integrity sha512-3KZ9lQ9AtNfGNH/mYJYaMKCiF2EQvLLBGYkWHeIzIs6foegcZNXe0Cyv3LNXuo5WslMNr5RT4wIgy3BOoAxdtg== - dependencies: - "@lerna/query-graph" "6.1.0" - chalk "^4.1.0" - columnify "^1.6.0" - -"@lerna/log-packed@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-6.1.0.tgz#18ae946e8b7881f2fc5b973cc6682cc599b1759b" - integrity sha512-Sq2HZJAcPuoNeEHeIutcPYQCyWBxLyVGvEhgsP3xTe6XkBGQCG8piCp9wX+sc2zT+idPdpI6qLqdh85yYIMMhA== - dependencies: - byte-size "^7.0.0" - columnify "^1.6.0" - has-unicode "^2.0.1" - npmlog "^6.0.2" - -"@lerna/npm-conf@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-6.1.0.tgz#79697260c9d14ffb9d892927f37fcde75b89ec58" - integrity sha512-+RD3mmJe9XSQj7Diibs0+UafAHPcrFCd29ODpDI+tzYl4MmYZblfrlL6mbSCiVYCZQneQ8Uku3P0r+DlbYBaFw== - dependencies: - config-chain "^1.1.12" - pify "^5.0.0" - -"@lerna/npm-dist-tag@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-6.1.0.tgz#29f843aa628687a29dc3a9b905dd3002db7a3820" - integrity sha512-1zo+Yww/lvWJWZnEXpke9dZSb5poDzhUM/pQNqAQYSlbZ96o18SuCR6TEi5isMPiw63Aq1MMzbUqttQfJ11EOA== - dependencies: - "@lerna/otplease" "6.1.0" - npm-package-arg "8.1.1" - npm-registry-fetch "^13.3.0" - npmlog "^6.0.2" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" -"@lerna/npm-install@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-6.1.0.tgz#b75d1f152540a144bd6c81586a9f6010ed7f3046" - integrity sha512-1SHmOHZA1YJuUctLQBRjA2+yMp+UNYdOBsFb3xUVT7MjWnd1Zl0toT3jxGu96RNErD9JKkk/cGo/Aq+DU3s9pg== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/get-npm-exec-opts" "6.1.0" - fs-extra "^9.1.0" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - signal-exit "^3.0.3" - write-pkg "^4.0.0" +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== -"@lerna/npm-publish@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-6.1.0.tgz#8fe561e639e6a06380354271aeca7cbc39acf7dd" - integrity sha512-N0LdR1ImZQw1r4cYaKtVbBhBPtj4Zu9NbvygzizEP5HuTfxZmE1Ans3w93Kks9VTXZXob8twNbXnzBwzTyEpEA== - dependencies: - "@lerna/otplease" "6.1.0" - "@lerna/run-lifecycle" "6.1.0" - fs-extra "^9.1.0" - libnpmpublish "^6.0.4" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - pify "^5.0.0" - read-package-json "^5.0.1" +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== -"@lerna/npm-run-script@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-6.1.0.tgz#bc5bd414ee9696168d88d8ce78f8e8b715967100" - integrity sha512-7p13mvdxdY5+VqWvvtMsMDeyCRs0PrrTmSHRO+FKuLQuGhBvUo05vevcMEOQNDvEvl/tXPrOVbeGCiGubYTCLg== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/get-npm-exec-opts" "6.1.0" - npmlog "^6.0.2" +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== -"@lerna/otplease@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-6.1.0.tgz#d25dbe2d867215b69f06de12ab4ff559d83d1d01" - integrity sha512-gqSE6IbaD4IeNJePkaDLaFLoGp0Ceu35sn7z0AHAOoHiQGGorOmvM+h1Md3xZZRSXQmY9LyJVhG5eRa38SoG4g== - dependencies: - "@lerna/prompt" "6.1.0" +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== -"@lerna/output@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/output/-/output-6.1.0.tgz#d470146c6ee8ee063fd416081c1ca64fb132c4d8" - integrity sha512-mgCIzLKIuroytXuxjTB689ERtpfgyNXW0rMv9WHOa6ufQc+QJPjh3L4jVsOA0l+/OxZyi97PUXotduNj+0cbnA== +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: - npmlog "^6.0.2" + eslint-visitor-keys "^3.3.0" -"@lerna/pack-directory@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-6.1.0.tgz#3252ba7250d826b9922238c775abf5004e7580c4" - integrity sha512-Xsixqm2nkGXs9hvq08ClbGpRlCYnlBV4TwSrLttIDL712RlyXoPe2maJzTUqo9OXBbOumFSahUEInCMT2OS05g== - dependencies: - "@lerna/get-packed" "6.1.0" - "@lerna/package" "6.1.0" - "@lerna/run-lifecycle" "6.1.0" - "@lerna/temp-write" "6.1.0" - npm-packlist "^5.1.1" - npmlog "^6.0.2" - tar "^6.1.0" +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== -"@lerna/package-graph@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-6.1.0.tgz#2373617605f48f53b5fa9d13188838b6c09022b0" - integrity sha512-yGyxd/eHTDjkpnBbDhTV0hwKF+i01qZc+6/ko65wOsh8xtgqpQeE6mtdgbvsLKcuMcIQ7PDy1ntyIv9phg14gQ== +"@eslint/eslintrc@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d" + integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== dependencies: - "@lerna/prerelease-id-from-version" "6.1.0" - "@lerna/validation-error" "6.1.0" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - semver "^7.3.4" + 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/package@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/package/-/package-6.1.0.tgz#e9e33876c0509a86c1b676045b19fd3f7f1c77e2" - integrity sha512-PyNFtdH2IcLasp/nyMDshmeXotriOSlhbeFIxhdl1XuGj5v1so3utMSOrJMO5kzZJQg5zyx8qQoxL+WH/hkrVQ== - dependencies: - load-json-file "^6.2.0" - npm-package-arg "8.1.1" - write-pkg "^4.0.0" +"@eslint/js@8.44.0": + version "8.44.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" + integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== -"@lerna/prerelease-id-from-version@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-6.1.0.tgz#4ee5beeef4e81d77001e94ec5613c140b6615616" - integrity sha512-ngC4I6evvZztB6aOaSDEnhUgRTlqX3TyBXwWwLGTOXCPaCQBTPaLNokhmRdJ+ZVdZ4iHFbzEDSL07ubZrYUcmQ== +"@floating-ui/core@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.3.1.tgz#4d795b649cc3b1cbb760d191c80dcb4353c9a366" + integrity sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g== + +"@floating-ui/dom@^1.0.1": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.4.5.tgz#336dfb9870c98b471ff5802002982e489b8bd1c5" + integrity sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw== dependencies: - semver "^7.3.4" + "@floating-ui/core" "^1.3.1" -"@lerna/profiler@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-6.1.0.tgz#aae2249f1a39c79db72a548ce50bf32f86a0f3a5" - integrity sha512-WFDQNpuqPqMJLg8llvrBHF8Ib5Asgp23lMeNUe89T62NUX6gkjVBTYdjsduxM0tZH6Pa0GAGaQcha97P6fxfdQ== +"@grpc/grpc-js@^1.8.14": + version "1.8.18" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.18.tgz#fdbf2728064fd3db7e72e970372db28bd0f6fafb" + integrity sha512-2uWPtxhsXmVgd8WzDhfamSjHpZDXfMjMDciY6VRTq4Sn7rFzazyf0LLDa0oav+61UHIoEZb4KKaAV6S7NuJFbQ== dependencies: - fs-extra "^9.1.0" - npmlog "^6.0.2" - upath "^2.0.1" + "@grpc/proto-loader" "^0.7.0" + "@types/node" ">=12.12.47" -"@lerna/project@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/project/-/project-6.1.0.tgz#605afe28fb15d8b8b890fafe0ec1da2700964056" - integrity sha512-EOkfjjrTM16c3GUxGqcfYD2stV35p9mBEmkF41NPmyjfbzjol/irDF1r6Q7BsQSRsdClMJRCeZ168xdSxC2X0A== +"@grpc/proto-loader@^0.7.0": + version "0.7.8" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.8.tgz#c050bbeae5f000a1919507f195a1b094e218036e" + integrity sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA== dependencies: - "@lerna/package" "6.1.0" - "@lerna/validation-error" "6.1.0" - cosmiconfig "^7.0.0" - dedent "^0.7.0" - dot-prop "^6.0.1" - glob-parent "^5.1.1" - globby "^11.0.2" - js-yaml "^4.1.0" - load-json-file "^6.2.0" - npmlog "^6.0.2" - p-map "^4.0.0" - resolve-from "^5.0.0" - write-json-file "^4.3.0" + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^7.2.4" + yargs "^17.7.2" -"@lerna/prompt@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-6.1.0.tgz#98e228220428d33620822f77e39f592ce29c776c" - integrity sha512-981J/C53TZ2l2mFVlWJN7zynSzf5GEHKvKQa12Td9iknhASZOuwTAWb6eq46246Ant6W5tWwb0NSPu3I5qtcrA== +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== dependencies: - inquirer "^8.2.4" - npmlog "^6.0.2" + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" -"@lerna/publish@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-6.1.0.tgz#9d62c327bc3541a0430951d726b39a2fb17b7925" - integrity sha512-XtvuydtU0IptbAapLRgoN1AZj/WJR+e3UKnx9BQ1Dwc+Fpg2oqPxR/vi+6hxAsr95pdQ5CnWBdgS+dg2wEUJ7Q== - dependencies: - "@lerna/check-working-tree" "6.1.0" - "@lerna/child-process" "6.1.0" - "@lerna/collect-updates" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/describe-ref" "6.1.0" - "@lerna/log-packed" "6.1.0" - "@lerna/npm-conf" "6.1.0" - "@lerna/npm-dist-tag" "6.1.0" - "@lerna/npm-publish" "6.1.0" - "@lerna/otplease" "6.1.0" - "@lerna/output" "6.1.0" - "@lerna/pack-directory" "6.1.0" - "@lerna/prerelease-id-from-version" "6.1.0" - "@lerna/prompt" "6.1.0" - "@lerna/pulse-till-done" "6.1.0" - "@lerna/run-lifecycle" "6.1.0" - "@lerna/run-topologically" "6.1.0" - "@lerna/validation-error" "6.1.0" - "@lerna/version" "6.1.0" - fs-extra "^9.1.0" - libnpmaccess "^6.0.3" - npm-package-arg "8.1.1" - npm-registry-fetch "^13.3.0" - npmlog "^6.0.2" - p-map "^4.0.0" - p-pipe "^3.1.0" - pacote "^13.6.1" - semver "^7.3.4" +"@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/pulse-till-done@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-6.1.0.tgz#df0112a9a5b8547b53d18742ce21104eb360d731" - integrity sha512-a2RVT82E4R9nVXtehzp2TQL6iXp0QfEM3bu8tBAR/SfI1A9ggZWQhuuUqtRyhhVCajdQDOo7rS0UG7R5JzK58w== - dependencies: - npmlog "^6.0.2" +"@humanwhocodes/object-schema@^1.2.1": + 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== -"@lerna/query-graph@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-6.1.0.tgz#e78c47c78d4691231fc379570e036bc2753cf6fa" - integrity sha512-YkyCc+6aR7GlCOcZXEKPcl5o5L2v+0YUNs59JrfAS0mctFosZ/2tP7pkdu2SI4qXIi5D0PMNsh/0fRni56znsQ== - dependencies: - "@lerna/package-graph" "6.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/resolve-symlink@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-6.1.0.tgz#5a8686b99c838bc6e869930e5b5fd582607ebbe7" - integrity sha512-8ILO+h5fsE0q8MSLfdL+MT1GEsNhAB1fDyMkSsYgLRCsssN/cViZbffpclZyT/EfAhpyKfBCHZ0CmT1ZGofU1A== +"@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: - fs-extra "^9.1.0" - npmlog "^6.0.2" - read-cmd-shim "^3.0.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/rimraf-dir@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-6.1.0.tgz#75559585d5921563eff0e206bb9ec8ab0cc967c6" - integrity sha512-J9YeGHkCCeAIzsnKURYeGECBexiIii6HA+Bbd+rAgoKPsNCOj6ql4+qJE8Jbd7fQEFNDPQeBCYvM7JcdMc0WSA== +"@jest/schemas@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.0.tgz#0f4cb2c8e3dca80c135507ba5635a4fd755b0040" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== dependencies: - "@lerna/child-process" "6.1.0" - npmlog "^6.0.2" - path-exists "^4.0.0" - rimraf "^3.0.2" + "@sinclair/typebox" "^0.27.8" -"@lerna/run-lifecycle@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-6.1.0.tgz#e1fa6cd300842ef1d688af77648fed05ec2d5345" - integrity sha512-GbTdKxL+hWHEPgyBEKtqY9Nf+jFlt6YLtP5VjEVc5SdLkm+FeRquar9/YcZVUbzr3c+NJwWNgVjHuePfowdpUA== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: - "@lerna/npm-conf" "6.1.0" - "@npmcli/run-script" "^4.1.7" - npmlog "^6.0.2" - p-queue "^6.6.2" + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" -"@lerna/run-topologically@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-6.1.0.tgz#8f1a428b5d4b800bced178edabfa2262b328572f" - integrity sha512-kpTaSBKdKjtf61be8Z1e7TIaMt/aksfxswQtpFxEuKDsPsdHfR8htSkADO4d/3SZFtmcAHIHNCQj9CaNj4O4Xw== - dependencies: - "@lerna/query-graph" "6.1.0" - p-queue "^6.6.2" +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@lerna/run@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/run/-/run-6.1.0.tgz#efaea1acc78cb7fc73b4906be70002e118628d64" - integrity sha512-vlEEKPcTloiob6EK7gxrjEdB6fQQ/LNfWhSJCGxJlvNVbrMpoWIu0Kpp20b0nE+lzX7rRJ4seWr7Wdo/Fjub4Q== - dependencies: - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/npm-run-script" "6.1.0" - "@lerna/output" "6.1.0" - "@lerna/profiler" "6.1.0" - "@lerna/run-topologically" "6.1.0" - "@lerna/timer" "6.1.0" - "@lerna/validation-error" "6.1.0" - fs-extra "^9.1.0" - p-map "^4.0.0" +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@lerna/symlink-binary@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-6.1.0.tgz#7d476499b86ae5fcb853c510603cff9a27acf105" - integrity sha512-DaiRNZk/dvomNxgEaTW145PyL7vIGP7rvnfXV2FO+rjX8UUSNUOjmVmHlYfs64gV9Eqx/dLfQClIbKcwYMD83A== +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: - "@lerna/create-symlink" "6.1.0" - "@lerna/package" "6.1.0" - fs-extra "^9.1.0" - p-map "^4.0.0" + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" -"@lerna/symlink-dependencies@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-6.1.0.tgz#f44d33e043fed21a366c4ced2cbde8fa8be0c5fc" - integrity sha512-hrTvtY1Ek+fLA4JjXsKsvwPjuJD0rwB/+K4WY57t00owj//BpCsJ37w3kkkS7f/PcW/5uRjCuHcY67LOEwsRxw== - dependencies: - "@lerna/create-symlink" "6.1.0" - "@lerna/resolve-symlink" "6.1.0" - "@lerna/symlink-binary" "6.1.0" - fs-extra "^9.1.0" - p-map "^4.0.0" - p-map-series "^2.1.0" +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@lerna/temp-write@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/temp-write/-/temp-write-6.1.0.tgz#a5d532090dd7b2d4f8965fbb475376aae06b9242" - integrity sha512-ZcQl88H9HbQ/TeWUOVt+vDYwptm7kwprGvj9KkZXr9S5Bn6SiKRQOeydCCfCrQT+9Q3dm7QZXV6rWzLsACcAlQ== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: - graceful-fs "^4.1.15" - is-stream "^2.0.0" - make-dir "^3.0.0" - temp-dir "^1.0.0" - uuid "^8.3.2" + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" -"@lerna/timer@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-6.1.0.tgz#245b02c05b2dec6d2aed2da8a0962cf0343d83d5" - integrity sha512-du+NQ9q7uO4d2nVU4AD2DSPuAZqUapA/bZKuVpFVxvY9Qhzb8dQKLsFISe4A9TjyoNAk8ZeWK0aBc/6N+Qer9A== +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@lerna/validation-error@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-6.1.0.tgz#03bd46f6219b6db7c4420528d5aaf047f92693e3" - integrity sha512-q0c3XCi5OpyTr8AcfbisS6e3svZaJF/riCvBDqRMaQUT4A8QOPzB4fVF3/+J2u54nidBuTlIk0JZu9aOdWTUkQ== +"@lerna/child-process@7.1.4": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.1.4.tgz#5ab64540b01a339ecc6787f4f06d29aee99d71d5" + integrity sha512-cSiMDx9oI9vvVT+V/WHcbqrksNoc9PIPFiks1lPS7zrVWkEbgA6REQyYmRd2H71kihzqhX5TJ20f2dWv6oEPdA== dependencies: - npmlog "^6.0.2" - -"@lerna/version@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/version/-/version-6.1.0.tgz#44d8649e978df9d6a14d97c9d7631a7dcd4a9cbf" - integrity sha512-RUxVFdzHt0739lRNMrAbo6HWcFrcyG7atM1pn+Eo61fUoA5R/9N4bCk4m9xUGkJ/mOcROjuwAGe+wT1uOs58Bg== - dependencies: - "@lerna/check-working-tree" "6.1.0" - "@lerna/child-process" "6.1.0" - "@lerna/collect-updates" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/conventional-commits" "6.1.0" - "@lerna/github-client" "6.1.0" - "@lerna/gitlab-client" "6.1.0" - "@lerna/output" "6.1.0" - "@lerna/prerelease-id-from-version" "6.1.0" - "@lerna/prompt" "6.1.0" - "@lerna/run-lifecycle" "6.1.0" - "@lerna/run-topologically" "6.1.0" - "@lerna/temp-write" "6.1.0" - "@lerna/validation-error" "6.1.0" - "@nrwl/devkit" ">=14.8.6 < 16" chalk "^4.1.0" - dedent "^0.7.0" - load-json-file "^6.2.0" - minimatch "^3.0.4" - npmlog "^6.0.2" - p-map "^4.0.0" - p-pipe "^3.1.0" + execa "^5.0.0" + strong-log-transformer "^2.1.0" + +"@lerna/create@7.1.4": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.1.4.tgz#bfff377c36734ef9a95e3fe8cb030d6498844928" + integrity sha512-D5YWXsXIxWb1aGqcbtttczg86zMzkNhcs00/BleFNxdNYlTRdjLIReELOGBGrq3Hij05UN+7Dv9EKnPFJVbqAw== + dependencies: + "@lerna/child-process" "7.1.4" + dedent "0.7.0" + fs-extra "^11.1.1" + init-package-json "5.0.0" + npm-package-arg "8.1.1" p-reduce "^2.1.0" - p-waterfall "^2.1.1" + pacote "^15.2.0" + pify "5.0.0" semver "^7.3.4" slash "^3.0.0" - write-json-file "^4.3.0" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "5.0.0" + yargs-parser "20.2.4" -"@lerna/write-log-file@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-6.1.0.tgz#b811cffd2ea2b3be6239a756c64dac9a3795707a" - integrity sha512-09omu2w4NCt8mJH/X9ZMuToQQ3xu/KpC7EU4yDl2Qy8nxKf8HiG8Oe+YYNprngmkdsq60F5eUZvoiFDZ5JeGIg== +"@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 "^6.0.2" - write-file-atomic "^4.0.1" + cross-spawn "^7.0.1" "@malept/cross-spawn-promise@^2.0.0": version "2.0.0" @@ -1880,10 +1299,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" @@ -1895,43 +1324,40 @@ 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.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz#44d752c1a2dc113f15f781b7cc4f53a307e3fa38" + integrity sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ== -"@msgpackr-extract/msgpackr-extract-darwin-arm64@2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.1.2.tgz#9571b87be3a3f2c46de05585470bc4f3af2f6f00" - integrity sha512-TyVLn3S/+ikMDsh0gbKv2YydKClN8HaJDDpONlaZR+LVJmsxLFUgA+O7zu59h9+f9gX1aj/ahw9wqa6rosmrYQ== +"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz#f954f34355712212a8e06c465bc06c40852c6bb3" + integrity sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw== -"@msgpackr-extract/msgpackr-extract-darwin-x64@2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.1.2.tgz#bfbc6936ede2955218f5621a675679a5fe8e6f4c" - integrity sha512-YPXtcVkhmVNoMGlqp81ZHW4dMxK09msWgnxtsDpSiZwTzUBG2N+No2bsr7WMtBKCVJMSD6mbAl7YhKUqkp/Few== +"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz#45c63037f045c2b15c44f80f0393fa24f9655367" + integrity sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg== -"@msgpackr-extract/msgpackr-extract-linux-arm64@2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.1.2.tgz#22555e28382af2922e7450634c8a2f240bb9eb82" - integrity sha512-vHZ2JiOWF2+DN9lzltGbhtQNzDo8fKFGrf37UJrgqxU0yvtERrzUugnfnX1wmVfFhSsF8OxrfqiNOUc5hko1Zg== +"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz#35707efeafe6d22b3f373caf9e8775e8920d1399" + integrity sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA== -"@msgpackr-extract/msgpackr-extract-linux-arm@2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.1.2.tgz#ffb6ae1beea7ac572b6be6bf2a8e8162ebdd8be7" - integrity sha512-42R4MAFeIeNn+L98qwxAt360bwzX2Kf0ZQkBBucJ2Ircza3asoY4CDbgiu9VWklq8gWJVSJSJBwDI+c/THiWkA== +"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz#091b1218b66c341f532611477ef89e83f25fae4f" + integrity sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA== -"@msgpackr-extract/msgpackr-extract-linux-x64@2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.1.2.tgz#7caf62eebbfb1345de40f75e89666b3d4194755f" - integrity sha512-RjRoRxg7Q3kPAdUSC5EUUPlwfMkIVhmaRTIe+cqHbKrGZ4M6TyCA/b5qMaukQ/1CHWrqYY2FbKOAU8Hg0pQFzg== +"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz#0f164b726869f71da3c594171df5ebc1c4b0a407" + integrity sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ== -"@msgpackr-extract/msgpackr-extract-win32-x64@2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.1.2.tgz#f2d8b9ddd8d191205ed26ce54aba3dfc5ae3e7c9" - integrity sha512-rIZVR48zA8hGkHIK7ED6+ZiXsjRCcAVBJbm8o89OKAMTmEAQ2QvoOxoiu3w2isAaWwzgtQIOFIqHwvZDyLKCvw== +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1946,12 +1372,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== @@ -1959,164 +1380,133 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/arborist@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-5.3.0.tgz#321d9424677bfc08569e98a5ac445ee781f32053" - integrity sha512-+rZ9zgL1lnbl8Xbb1NQdMjveOMwj4lIYfcDtyJHHi5x4X8jtR6m8SXooJMZy5vmFVZ8w7A2Bnd/oX9eTuU8w5A== - dependencies: - "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/map-workspaces" "^2.0.3" - "@npmcli/metavuln-calculator" "^3.0.1" - "@npmcli/move-file" "^2.0.0" - "@npmcli/name-from-folder" "^1.0.1" - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/package-json" "^2.0.0" - "@npmcli/run-script" "^4.1.3" - bin-links "^3.0.0" - cacache "^16.0.6" - common-ancestor-path "^1.0.1" - json-parse-even-better-errors "^2.3.1" - json-stringify-nice "^1.1.4" - mkdirp "^1.0.4" - mkdirp-infer-owner "^2.0.0" - nopt "^5.0.0" - npm-install-checks "^5.0.0" - npm-package-arg "^9.0.0" - npm-pick-manifest "^7.0.0" - npm-registry-fetch "^13.0.0" - npmlog "^6.0.2" - pacote "^13.6.1" - parse-conflict-json "^2.0.1" - proc-log "^2.0.0" - promise-all-reject-late "^1.0.0" - promise-call-limit "^1.0.1" - read-package-json-fast "^2.0.2" - readdir-scoped-modules "^1.1.0" - rimraf "^3.0.2" - semver "^7.3.7" - ssri "^9.0.0" - treeverse "^2.0.0" - walk-up-path "^1.0.0" - -"@npmcli/fs@^2.1.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.1.tgz#c0c480b03450d8b9fc086816a50cb682668a48bf" - integrity sha512-1Q0uzx6c/NVNGszePbr5Gc2riSU1zLpNlo/1YWntH+eaPmMgBssAW0qXofCVkpdj3ce4swZtlDYQu+NKiYcptg== +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== dependencies: - "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/git@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-3.0.2.tgz#5c5de6b4d70474cf2d09af149ce42e4e1dacb931" - integrity sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w== +"@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: - "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" lru-cache "^7.4.4" - mkdirp "^1.0.4" - npm-pick-manifest "^7.0.0" - proc-log "^2.0.0" + 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 "^2.0.2" - -"@npmcli/installed-package-contents@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" - integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== - dependencies: - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" - -"@npmcli/map-workspaces@^2.0.3": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-2.0.4.tgz#9e5e8ab655215a262aefabf139782b894e0504fc" - integrity sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg== - dependencies: - "@npmcli/name-from-folder" "^1.0.1" - glob "^8.0.1" - minimatch "^5.0.1" - read-package-json-fast "^2.0.3" - -"@npmcli/metavuln-calculator@^3.0.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.1.tgz#9359bd72b400f8353f6a28a25c8457b562602622" - integrity sha512-n69ygIaqAedecLeVH3KnO39M6ZHiJ2dEv5A7DGvcqCB8q17BGUgW8QaanIkbWUo2aYGZqJaOORTLAlIvKjNDKA== - dependencies: - cacache "^16.0.0" - json-parse-even-better-errors "^2.3.1" - pacote "^13.0.3" - semver "^7.3.5" + which "^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== +"@npmcli/installed-package-contents@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@npmcli/name-from-folder@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz#77ecd0a4fcb772ba6fe927e2e2e155fbec2e6b1a" - integrity sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA== + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" -"@npmcli/node-gyp@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz#8c20e53e34e9078d18815c1d2dda6f2420d75e35" - integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== +"@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/package-json@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-2.0.0.tgz#3bbcf4677e21055adbe673d9f08c9f9cde942e4a" - integrity sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA== +"@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: - json-parse-even-better-errors "^2.3.1" + which "^3.0.0" -"@npmcli/promise-spawn@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz#53283b5f18f855c6925f23c24e67c911501ef573" - integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g== +"@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: - infer-owner "^1.0.4" + "@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" -"@npmcli/run-script@^4.1.0", "@npmcli/run-script@^4.1.3", "@npmcli/run-script@^4.1.7": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.2.1.tgz#c07c5c71bc1c70a5f2a06b0d4da976641609b946" - integrity sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg== +"@nrwl/devkit@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.5.2.tgz#eedcf4e546e2ebd3d01babcf5c97bc2b6bf08408" + integrity sha512-4L8cHD6cDTVWqylzM9vNbh8MuujsBpEP0yiTKQOBfAkTWpp/PcyFsnCMtYEiaWIQ5xSrruVbL5pb9KEL4ayLAg== dependencies: - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/promise-spawn" "^3.0.0" - node-gyp "^9.0.0" - read-package-json-fast "^2.0.3" - which "^2.0.2" + "@nx/devkit" "16.5.2" -"@nrwl/cli@15.3.0": - version "15.3.0" - resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-15.3.0.tgz#61b145d2ba613f9df4dbb9188e631ca50a4e42cb" - integrity sha512-WAki2+puBp6qel/VAxdQmr/L/sLyw8K6bynYNmMl4eIlR5hjefrUChPzUiJDAS9/CUYQNOyva2VV5wofzdv95w== +"@nrwl/tao@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.5.2.tgz#6b46b880e36ff0af4cceaf2409fd2055bf2cf2b1" + integrity sha512-4vQt0Jj9xHc8SpNgM2TxkPZrkjf4ayNW7elgt5rlOT1yD3Q1Fn3/VHb3cWtm/RC2vSckB4qUEuFGpdEU8wEnCg== dependencies: - nx "15.3.0" + nx "16.5.2" -"@nrwl/devkit@>=14.8.6 < 16": - version "15.3.0" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.3.0.tgz#4b0fc4c94f0b92413aa3d028f8cc75f586936d27" - integrity sha512-1O9QLB/eYS6ddw4MZnV4yj4CEqLIbpleZZiG/9w1TaiVO/jfNfXVaxc8EA87XSzMpk2W+/4Qggmabt6gAQaabA== +"@nx/devkit@16.5.2", "@nx/devkit@>=16.5.1 < 17": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.5.2.tgz#0a30fc4e3beeea7d7bf16a0496d1ff3c5fa05299" + integrity sha512-QDOQeFzVhQCA65g+2RfoGKZBUnCb151+F7/PvwRESEM+jybXHoXwR9PSE3ClnnmO/d0LUKB2ohU3Z9WQrQDALQ== dependencies: - "@phenomnomnominal/tsquery" "4.1.1" + "@nrwl/devkit" "16.5.2" ejs "^3.1.7" ignore "^5.0.4" - semver "7.3.4" + semver "7.5.3" + tmp "~0.2.1" tslib "^2.3.0" -"@nrwl/tao@15.3.0": - version "15.3.0" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-15.3.0.tgz#20266f1269815cb28e21677b0aa7f913a7e31b17" - integrity sha512-alyzKKSgfgPwQ/FUozvk43VGOZHyNMiSM6Udl49ZaQwT77GXRFkrOu21odW6dciWPd3iUOUjfJISNqrEJmxvpw== - dependencies: - nx "15.3.0" +"@nx/nx-darwin-arm64@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.2.tgz#0efcc62881eddd20e5bb8f881e6c8cc082c864f8" + integrity sha512-myiNbDJLhhVHRLo6z3TeiaUeYTWdvBR3RdHQq4szTgb82Bnn8ruzteRGGJwKZd551YlttRcieBysxzUzHkmVBg== + +"@nx/nx-darwin-x64@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.2.tgz#6b03c1f4569411db7f8f90df90c820b083bde65f" + integrity sha512-m354qmKrv7a5eD9Qv8bGEmrLCBEyCS6/y0PyOR32Dmi7qwlgHsQ4FfVkOnlWefC5ednhFLJQT6yxwhg8cFGDxw== + +"@nx/nx-freebsd-x64@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.2.tgz#931e8be5c70d87b87f17d8faf0b9089383df0505" + integrity sha512-qrR9yxcC2BLnw9JulecILmyp6Jco9unHHzQcfhLZTpw5c1PNHmZzHwJ3i3iNEf1o2kXEIa+SlOCis9ndvNQQVA== + +"@nx/nx-linux-arm-gnueabihf@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.2.tgz#d9d865f99ba1128f6aa5b6bf0887bb743590eeb6" + integrity sha512-+I1Oj54caDymMsQuRu/l4ULS4RVvwDUM1nXey5JhWulDOUF//09Ckz03Q9p0NCnvBvQd3SyE65++PMfZrrurbA== + +"@nx/nx-linux-arm64-gnu@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.2.tgz#c442df598108776cce297561555520ffbce251ea" + integrity sha512-4Q4jpgtNBTb4lMegFKS9hkzS/WttH3MxkgM//8qs1zhgUz/AsuXTitBo71E3xCnQl/i38p0eIpiKXXwBJeHgDw== + +"@nx/nx-linux-arm64-musl@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.2.tgz#e07c0031f60372e726d2272fac5f3743c4d9591c" + integrity sha512-VLukS/pfenr/Qw/EUn3GPAREDVXuSmfKeYBQKkALXEK6cRVQhXFXMLGHgMemCYbpoUJyFtFEO94PKV7VU7wZPg== + +"@nx/nx-linux-x64-gnu@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.2.tgz#0748beae6944b42276f4705bc41b9e06cefb1d55" + integrity sha512-TAGmY+MXbNl/aGg2KMvtg53rbmX0XHwnJRQtjhjqjAyvaOfFWI/WOqTU7xf/QCkXBUIK0D9xHWpALfA/fZFCBA== + +"@nx/nx-linux-x64-musl@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.2.tgz#7b150081e21ba7aa0da511f80aae1c5d230d1664" + integrity sha512-YyWmqcNbZgU76+LThAt+0arx9C2ewfI5UUI6kooZRniAd408EA2xl5fx2AWLLrISGH4nTb5p20HGmeWfGqjHPA== + +"@nx/nx-win32-arm64-msvc@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.2.tgz#f06f74b876c92d6b12cd351baff016b18bfd9a73" + integrity sha512-pl7LluCc/57kl9VZ1ES27ym16ps4zgfCIeJiF8Ne8C6ALgt7C3PEG6417sFqbQw5J7NhsZ1aTb3eJ9fa9hurhA== + +"@nx/nx-win32-x64-msvc@16.5.2": + version "16.5.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.2.tgz#6ae96b6a90924daba81350863da4f9d12884fe8e" + integrity sha512-bKSMElhzP37MkzWQ/Y12pQlesZ6TxwOOqwoaK/vHe6ZtxPxvG2+U8tQ21Nw5L3KyrDCnU5MJHGFtQVHHHt5MwA== "@octokit/auth-token@^2.4.4": version "2.5.0" @@ -2126,11 +1516,9 @@ "@octokit/types" "^6.0.3" "@octokit/auth-token@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.2.tgz#a0fc8de149fd15876e1ac78f6525c1c5ab48435f" - integrity sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q== - dependencies: - "@octokit/types" "^8.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" @@ -2145,16 +1533,16 @@ before-after-hook "^2.2.0" universal-user-agent "^6.0.0" -"@octokit/core@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.1.0.tgz#b6b03a478f1716de92b3f4ec4fd64d05ba5a9251" - integrity sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ== +"@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" "^8.0.0" + "@octokit/types" "^9.0.0" before-after-hook "^2.2.0" universal-user-agent "^6.0.0" @@ -2168,11 +1556,11 @@ universal-user-agent "^6.0.0" "@octokit/endpoint@^7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.3.tgz#0b96035673a9e3bedf8bab8f7335de424a2147ed" - integrity sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw== + 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" "^8.0.0" + "@octokit/types" "^9.0.0" is-plain-object "^5.0.0" universal-user-agent "^6.0.0" @@ -2186,25 +1574,25 @@ universal-user-agent "^6.0.0" "@octokit/graphql@^5.0.0": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.4.tgz#519dd5c05123868276f3ae4e50ad565ed7dff8c8" - integrity sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A== + 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" "^8.0.0" + "@octokit/types" "^9.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^12.10.0": - version "12.10.1" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.10.1.tgz#57b5cc6c7b4e55d8642c93d06401fb1af4839899" - integrity sha512-P+SukKanjFY0ZhsK6wSVnQmxTP2eVPPE8OPSNuxaMYtgVzwJZgfGdwlYjf4RlRU4vLEw4ts2fsE2icG4nZ5ddQ== +"@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@^14.0.0": - version "14.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-14.0.0.tgz#949c5019028c93f189abbc2fb42f333290f7134a" - integrity sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw== +"@octokit/openapi-types@^18.0.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.0.0.tgz#f43d765b3c7533fd6fb88f3f25df079c24fccf69" + integrity sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw== -"@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== @@ -2216,12 +1604,13 @@ dependencies: "@octokit/types" "^6.40.0" -"@octokit/plugin-paginate-rest@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz#93d7e74f1f69d68ba554fa6b888c2a9cf1f99a83" - integrity sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw== +"@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" "^8.0.0" + "@octokit/tsconfig" "^1.0.2" + "@octokit/types" "^9.2.3" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" @@ -2236,13 +1625,12 @@ "@octokit/types" "^6.39.0" deprecation "^2.3.1" -"@octokit/plugin-rest-endpoint-methods@^6.7.0": - version "6.7.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz#2f6f17f25b6babbc8b41d2bb0a95a8839672ce7c" - integrity sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw== +"@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" "^8.0.0" - deprecation "^2.3.1" + "@octokit/types" "^10.0.0" "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": version "2.1.0" @@ -2254,11 +1642,11 @@ once "^1.4.0" "@octokit/request-error@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.2.tgz#f74c0f163d19463b87528efe877216c41d6deb0a" - integrity sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg== + 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" "^8.0.0" + "@octokit/types" "^9.0.0" deprecation "^2.0.0" once "^1.4.0" @@ -2275,17 +1663,27 @@ universal-user-agent "^6.0.0" "@octokit/request@^6.0.0": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.2.tgz#a2ba5ac22bddd5dcb3f539b618faa05115c5a255" - integrity sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw== + 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" "^8.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" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.12.0.tgz#f06bc4952fc87130308d810ca9d00e79f6988881" @@ -2296,29 +1694,31 @@ "@octokit/plugin-request-log" "^1.0.4" "@octokit/plugin-rest-endpoint-methods" "^5.12.0" -"@octokit/rest@^19.0.3": - version "19.0.5" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.5.tgz#4dbde8ae69b27dca04b5f1d8119d282575818f6c" - integrity sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow== +"@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/core" "^4.1.0" - "@octokit/plugin-paginate-rest" "^5.0.0" - "@octokit/plugin-request-log" "^1.0.4" - "@octokit/plugin-rest-endpoint-methods" "^6.7.0" + "@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.40.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.40.0.tgz#f2e665196d419e19bb4265603cf904a820505d0e" - integrity sha512-MFZOU5r8SwgJWDMhrLUSvyJPtVsqA6VnbVI3TNbsmw+Jnvrktzvq2fYES/6RiJA/5Ykdwq4mJmtlYUfW7CGjmw== + 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.10.0" + "@octokit/openapi-types" "^12.11.0" -"@octokit/types@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-8.0.0.tgz#93f0b865786c4153f0f6924da067fe0bb7426a9f" - integrity sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg== +"@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" "^14.0.0" + "@octokit/openapi-types" "^18.0.0" "@parcel/watcher@2.0.4": version "2.0.4" @@ -2328,13 +1728,6 @@ node-addon-api "^3.2.1" node-gyp-build "^4.3.0" -"@phenomnomnominal/tsquery@4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-4.1.1.tgz#42971b83590e9d853d024ddb04a18085a36518df" - integrity sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ== - dependencies: - esquery "^1.0.1" - "@phosphor/algorithm@1", "@phosphor/algorithm@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@phosphor/algorithm/-/algorithm-1.2.0.tgz#4a19aa59261b7270be696672dc3f0663f7bef152" @@ -2434,10 +1827,15 @@ "@phosphor/signaling" "^1.3.1" "@phosphor/virtualdom" "^1.2.0" +"@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.5" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" - integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw== + 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" @@ -2492,50 +1890,70 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@puppeteer/browsers@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-0.5.0.tgz#1a1ee454b84a986b937ca2d93146f25a3fe8b670" + integrity sha512-Uw6oB7VvmPRLE4iKsjuOh8zgDabhNX67dzo8U/BB0f9527qx+4eeUs+korU98OhG5C4ubg7ufBgVi63XYwS6TQ== + dependencies: + debug "4.3.4" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + progress "2.0.3" + proxy-from-env "1.1.0" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + yargs "17.7.1" + +"@sigstore/protobuf-specs@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" + integrity sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ== + +"@sigstore/tuf@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-1.0.2.tgz#acbb2c8399fb03aca0c90fa1dc1934bda4160623" + integrity sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q== + dependencies: + "@sigstore/protobuf-specs" "^0.1.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== +"@sindresorhus/is@^5.2.0": + version "5.5.1" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.5.1.tgz#a18b694ca8e9f45d64f578a4779568dd74d232b8" + integrity sha512-wTsEUhqTXg1NDW+o9aWANj4LxELwWjqN0F3ltsWwpYoh0NSlMWo+u7FluRrSF2E2uaPYx7dJ3FnTf69git/0ug== + "@socket.io/component-emitter@~3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== -"@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" @@ -2543,22 +1961,29 @@ dependencies: defer-to-connect "^2.0.0" -"@theia/application-manager@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/application-manager/-/application-manager-1.31.1.tgz#d8407f2cf49f87e9539fc0f4b6b2ee2c527059fd" - integrity sha512-mzFbQPGxl6ilwjdMPJRFR7bnSZQc9VhxD6EDrC3nfKLRPI66qsB8UuoCavIvviWaPb0r1zsMGN9M3HDyVU+15w== +"@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.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/application-manager/-/application-manager-1.39.0.tgz#5a6ffd959754d17f47c125029ac4f76ba0ab3377" + integrity sha512-XgZQLRyr1Ty/xyiD2HvaL3+DeF6R/yXfgu85tTOD0wKVjRqSqI/5iSv0EBspdJUCxuVDrmQT4jBnRsXTDhixvA== 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.31.1" - "@theia/ffmpeg" "1.31.1" + "@theia/application-package" "1.39.0" + "@theia/ffmpeg" "1.39.0" + "@theia/native-webpack-plugin" "1.39.0" "@types/fs-extra" "^4.0.2" "@types/semver" "^7.3.8" 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" @@ -2568,6 +1993,7 @@ 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" setimmediate "^1.0.5" @@ -2577,89 +2003,91 @@ string-replace-loader "^3.1.0" style-loader "^2.0.0" 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.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.31.1.tgz#fb83e19f9bc815082f5b206b2ed0693993e6240c" - integrity sha512-JhzvlnBf3els/ioaRnLf+slzKfNos/11t+ybnWmSGlTeaiTI9uZ7+MWT9IusGCvPN/BaCJdq24SJTk8IV1eNkA== +"@theia/application-package@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/application-package/-/application-package-1.39.0.tgz#e8ec34d47c059ea8215f24e8cf8b8ad7d1445c6d" + integrity sha512-5IP9DavsspA3wUo0P0Cds1ESFtJGl+7LCZnMwCl06xVJYyrii7IQ7CDy8FmG0iDZF0bFDwOwTnRgI61YqAjx3g== dependencies: + "@theia/request" "1.39.0" "@types/fs-extra" "^4.0.2" - "@types/request" "^2.0.3" "@types/semver" "^5.4.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" + resolve-package-path "^4.0.3" semver "^5.4.1" write-json-file "^2.2.0" -"@theia/bulk-edit@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/bulk-edit/-/bulk-edit-1.31.1.tgz#83b638427768e2e2b74fb8de94cf953d34529be6" - integrity sha512-6cJ9baWetLWClOUaZotpJVI3Bqx4+IHyCxvQEPlHWR4imJzHvKRVShewlhXh66BPzyJvPeoF5YGp5FOpK81MaQ== - dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/monaco" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" - "@theia/workspace" "1.31.1" - -"@theia/callhierarchy@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.31.1.tgz#35c8f2c8071cd82510afb0d56e83c32016ef2460" - integrity sha512-azTwn9zGR9OuJpfsytX464sGOlHn3ECruhEgnOZN77oWBvU8LJO8hmTgEiA4lvHgXg5JkvsygeUyVNQ9YKe4KA== - dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" +"@theia/bulk-edit@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/bulk-edit/-/bulk-edit-1.39.0.tgz#0e9be86b1e5d7ec28fae0b324ed8d941a19ab93b" + integrity sha512-Z4Bq3kVkXxK4kbrp6NKmtOVPBbAI3QZhnHisJ6h4hp6jhPgppvUQXgyXIZMywpQJGoj8URLYWvQb/KEcD1u3wQ== + dependencies: + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/monaco" "1.39.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/workspace" "1.39.0" + +"@theia/callhierarchy@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/callhierarchy/-/callhierarchy-1.39.0.tgz#a78062ddca0a12cc5b1a1d9b44a41e0564861270" + integrity sha512-5TNm6NTdFGZXr+uHjk3+Ver2QcrmayVrQlX22R6ZdTP3unaR5ye1Fyk2qM68XKoAHdn+ObAtGpfsQro5Wyj9Kg== + dependencies: + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" ts-md5 "^1.2.2" -"@theia/cli@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/cli/-/cli-1.31.1.tgz#4a7f61dff030e931b18d7f95feb6387da5872722" - integrity sha512-hv4W8bp0cTz9Ew8DAIZzGRXVZGLpxXSZN7wO28nz3xwkjdQfqxNE/jMcT4nvso/7c1ubXUZt7a6+PfM70wrvFQ== - dependencies: - "@theia/application-manager" "1.31.1" - "@theia/application-package" "1.31.1" - "@theia/ffmpeg" "1.31.1" - "@theia/localization-manager" "1.31.1" - "@theia/ovsx-client" "1.31.1" - "@theia/request" "1.31.1" +"@theia/cli@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/cli/-/cli-1.39.0.tgz#7a304f7e622206dbe5b846431bfa8c582c8d4121" + integrity sha512-gYZY16dr+49hO0r1WqwHYkxR/rJ75NUtaqUa6QyO/And4QjTMvZCC1u3RAg6yLWR5NyLdd7hhRtzb8fb9kWcOA== + dependencies: + "@theia/application-manager" "1.39.0" + "@theia/application-package" "1.39.0" + "@theia/ffmpeg" "1.39.0" + "@theia/localization-manager" "1.39.0" + "@theia/ovsx-client" "1.39.0" + "@theia/request" "1.39.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" chalk "4.0.0" decompress "^4.2.1" + escape-string-regexp "4.0.0" glob "^8.0.3" + limiter "^2.1.0" log-update "^4.0.0" - mocha "^7.0.0" - puppeteer "^2.0.0" - puppeteer-to-istanbul "^1.2.2" + mocha "^10.1.0" + puppeteer "^19.7.2" + puppeteer-core "^19.7.2" + puppeteer-to-istanbul "^1.4.0" temp "^0.9.1" yargs "^15.3.1" -"@theia/console@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.31.1.tgz#02abb7629bd63b825e47e21d0fd55aec72aa931f" - integrity sha512-eznAkF/8KHqheDGo2olpAt4f/qjgpF7Ut0YTkhvTyofNfZTHpSzznG6jN+mlNO82bFUxa+ygKG+T/9Zv1e1O3Q== +"@theia/console@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/console/-/console-1.39.0.tgz#49b62d2818f030bcd6def7ff59b86b5b48d4a7e4" + integrity sha512-MOF1TGAzSZNdwZCCJdzccycwXeeMwtq8pdKta+cz8v3JSZEKyhczAgqD/eQ7+eHCm9aW16bybmcEoBqXirZqXA== dependencies: - "@theia/core" "1.31.1" - "@theia/monaco" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" + "@theia/core" "1.39.0" + "@theia/monaco" "1.39.0" + "@theia/monaco-editor-core" "1.72.3" anser "^2.0.1" -"@theia/core@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.31.1.tgz#a76c5f5579a5c4d006f4b436a8dc6fb0864eed89" - integrity sha512-wXl32nV3NcA46HFpQIRjjoQwFfuFf3PHpwmxQ6LLufqykql3NAhHtyPbSwj7pTJuEZI/Vd1vdp/ygUe0prKvvQ== +"@theia/core@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/core/-/core-1.39.0.tgz#34bf07edce5e4e90ef0578acca46e51ce07450fc" + integrity sha512-EmvIpp3mKGSFO50iOm3hOa66WlyHigFOGyq1N4nVibzb82/T065LZDof8NTLXl50cMr6H3ZFhBC32TTGf4ircw== dependencies: "@babel/runtime" "^7.10.0" "@phosphor/algorithm" "1" @@ -2672,8 +2100,8 @@ "@phosphor/signaling" "1" "@phosphor/virtualdom" "1" "@phosphor/widgets" "1" - "@theia/application-package" "1.31.1" - "@theia/request" "1.31.1" + "@theia/application-package" "1.39.0" + "@theia/request" "1.39.0" "@types/body-parser" "^1.16.4" "@types/cookie" "^0.3.3" "@types/dompurify" "^2.2.2" @@ -2690,6 +2118,7 @@ "@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" @@ -2704,14 +2133,14 @@ http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" iconv-lite "^0.6.0" - inversify "^5.1.1" + inversify "^6.0.1" jschardet "^2.1.1" keytar "7.2.0" lodash.debounce "^4.0.8" lodash.throttle "^4.1.1" markdown-it "^12.3.2" msgpackr "^1.6.1" - nsfw "^2.1.2" + nsfw "^2.2.4" p-debounce "^2.1.0" perfect-scrollbar "^1.3.0" react "^18.2.0" @@ -2724,81 +2153,86 @@ socket.io "^4.5.3" socket.io-client "^4.5.3" uuid "^8.3.2" - vscode-languageserver-protocol "~3.15.3" + vscode-languageserver-protocol "^3.17.2" vscode-uri "^2.1.1" ws "^7.1.2" yargs "^15.3.1" -"@theia/debug@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.31.1.tgz#c085fffa47ffafea8e65e7db16372d0b98233fa2" - integrity sha512-YYRS7XEfPJR4y+QNHn5yjH/Ay/3YKnwYXULK8zf2I1FRr2Sf4IRYDnPg5jXJe3qsGHEsYLRO5ZhN4GDdN6DrVg== - dependencies: - "@theia/console" "1.31.1" - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/markers" "1.31.1" - "@theia/monaco" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" - "@theia/output" "1.31.1" - "@theia/process" "1.31.1" - "@theia/task" "1.31.1" - "@theia/terminal" "1.31.1" - "@theia/variable-resolver" "1.31.1" - "@theia/workspace" "1.31.1" +"@theia/debug@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/debug/-/debug-1.39.0.tgz#54bd1458c038edc90ce119a1f956c35e26e350f9" + integrity sha512-SySuVoCzIC0/P2c1Fy0eUJOTOzXoWxrH4oPfZI7sFZCO70nIikJz79ZmAqo9qGT8/VAZysAu2e3LbQddhAU7cw== + dependencies: + "@theia/console" "1.39.0" + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/markers" "1.39.0" + "@theia/monaco" "1.39.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/output" "1.39.0" + "@theia/process" "1.39.0" + "@theia/task" "1.39.0" + "@theia/terminal" "1.39.0" + "@theia/variable-resolver" "1.39.0" + "@theia/workspace" "1.39.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" -"@theia/editor@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.31.1.tgz#0f6f22625b030c3ada6bb44f6ceeb40afd60b9d0" - integrity sha512-49rkCaS/6uxYLXt6BwcjjNwcIMdoEt5Iny3yCheHcUyScmMGId1NlEdJq2vgwxWxjX0nHLt+/j2OOlvLITVvCA== +"@theia/editor-preview@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/editor-preview/-/editor-preview-1.39.0.tgz#3d724fe8ffc21e5fd5f13b1dd51116f8a1ffa94a" + integrity sha512-xOTwk7wBcZzOXZ+5Bk5lk9zW+lFCWEsv7syu/+5HZ/34ItAw6V4EzVOyMn5RFsUS/oJb2ZVXBqdSX8O/dVkSfQ== dependencies: - "@theia/core" "1.31.1" - "@theia/variable-resolver" "1.31.1" + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/navigator" "1.39.0" -"@theia/electron@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.31.1.tgz#6b11cf500a6dc3607d7dd2f529cdabc599f698b0" - integrity sha512-5FaVlf3+QMVZ2zIQNaBrLOde+TsaXOarGF5YwYn03MZU7QAFO/l4fIq8hXDk3cmHtQ6JsTbyz1nKnM5GY2IKXw== +"@theia/editor@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/editor/-/editor-1.39.0.tgz#ef083070b254a03dd2899975b455abbcc5dbac66" + integrity sha512-CX/Ttl48H0ZKfNq+am/lSYwzDk+y+Ok6nmgqlZ39OpwrHH6z57VvKX+GpRSFBsT8IxWRRlscx2hoBW0yURRVlQ== + dependencies: + "@theia/core" "1.39.0" + "@theia/variable-resolver" "1.39.0" + +"@theia/electron@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/electron/-/electron-1.39.0.tgz#3c1893ba9b687079c38b5805ce0541c12fbc61d6" + integrity sha512-vZ7Vv6//O93pUo5A3B4rSXR+BSHmng6dVIMp01ZuUCG+3crjaPuIRfj6B704KS4df5JUdpEgd6S3H3K0//kGBA== 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.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/ffmpeg/-/ffmpeg-1.31.1.tgz#cc04d80ff397c3c87d2ce6f729d717a1eb656140" - integrity sha512-r1XTyKiaSNC7ccCjkZ9MVgCAC7i98RF6PZBW/CJkFShZ4cEqFCd/A3ndjdeagySD73j4sw9wAZCNw6gCvKXTNg== +"@theia/ffmpeg@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/ffmpeg/-/ffmpeg-1.39.0.tgz#0b82b0aa876018286fed3a71dbcf9fcc56ad1c83" + integrity sha512-TegG0fsEuvHbqLVr+NbkSsb/PzCXBM1RdowJhtkvTfSqZRW5dIWwA0KcojrPR5In+67Nv+BC+7kQAIlh4DXyPg== dependencies: "@electron/get" "^2.0.0" unzipper "^0.9.11" -"@theia/file-search@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.31.1.tgz#a85cba17ad368597789a81e308e08506f551cb1e" - integrity sha512-O9kRsV2Bd0lDye2Z0GY68I0OgKCrq1j41YJicI8+lna4Pb9ouZ/XgGkAlcSWtmdsnOHE/IMcnmlJQTwJyGGahQ== +"@theia/file-search@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/file-search/-/file-search-1.39.0.tgz#2f733bf7226325cc9921481b16e88dfef7abe22b" + integrity sha512-LmeucBYZDVKA+pe1l6wNOl3RV9le585dZtaBBiNDo1d68NKG4elssdsVmPGyZyWG28C54qGfTm0VD+KNtLVYLg== dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/process" "1.31.1" - "@theia/workspace" "1.31.1" + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/process" "1.39.0" + "@theia/workspace" "1.39.0" "@vscode/ripgrep" "^1.14.2" -"@theia/filesystem@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.31.1.tgz#0a16fde4751b6a86fe910e19806c2e6a25aa9a6b" - integrity sha512-DAm9PXmnMOn2xxCBYbsJ7LDhIQwz4sAKCAmWWYBxUBhX4Zt765UsPUlgNDaOACShSQZvI1rZjKf8rrXcZuMgfQ== +"@theia/filesystem@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/filesystem/-/filesystem-1.39.0.tgz#e031d4b6e8eb6a43422844e32c1e64e2a301e70b" + integrity sha512-dhS/xMqeJ1rjmznw2v3BYt28U/ETAhrjw3DeWDSheNalIobTXEc3oCUpSgameNHDVrehpA47cYGwOTymHYfcrg== dependencies: - "@theia/core" "1.31.1" + "@theia/core" "1.39.0" "@types/body-parser" "^1.17.0" "@types/multer" "^1.4.7" "@types/rimraf" "^2.0.2" @@ -2807,30 +2241,30 @@ async-mutex "^0.3.1" body-parser "^1.18.3" http-status-codes "^1.3.0" - minimatch "^3.0.4" + minimatch "^5.1.0" multer "1.4.4-lts.1" rimraf "^2.6.2" tar-fs "^1.16.2" - trash "^6.1.1" + trash "^7.2.0" uuid "^8.0.0" vscode-languageserver-textdocument "^1.0.1" -"@theia/keymaps@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.31.1.tgz#e3a079398f0ea1e340e09ace3e2e4f2e698665fd" - integrity sha512-da29Q4RN8Xp62EjlN0PgBVbtBKMsJ2bhfRYvFLn0XCmGqcWB0qN2fbvRzbQJITnNteJE/RW7uers7LnlpC6jwA== +"@theia/keymaps@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/keymaps/-/keymaps-1.39.0.tgz#6144b353c3511fca9c7da4fd84d261bce23cb73b" + integrity sha512-Do413ddkxdnS9+LFRyDlfkTgTv+P4HAptg1VzWgjpA+qi8zDaMrgTHjywbZVEog2aXgCKMflqFRAKPX1Jp8mdQ== dependencies: - "@theia/core" "1.31.1" - "@theia/monaco" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" - "@theia/preferences" "1.31.1" - "@theia/userstorage" "1.31.1" + "@theia/core" "1.39.0" + "@theia/monaco" "1.39.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/preferences" "1.39.0" + "@theia/userstorage" "1.39.0" jsonc-parser "^2.2.0" -"@theia/localization-manager@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/localization-manager/-/localization-manager-1.31.1.tgz#c4280893d89886789f158b955c47bbfcc5b2d28c" - integrity sha512-wEvvVhJbqRWhAakpCz7h/2/b1wK1+2nAxVtdhw95Dzc95evrvps8Cb3Vc439S/2ksOWI/dOVnDVmZymvnKG/xg== +"@theia/localization-manager@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/localization-manager/-/localization-manager-1.39.0.tgz#4752b49b93f0de2c6e9aa8e121e5cf251ba7d021" + integrity sha512-RlUBmInrIhigd24kxpF8qeLcswA2QiWMXDqgQkOG6ZYfZ86aMpka6xBn6s32ijOpUwmhU7VOkFm0Zxf0DwBhEg== dependencies: "@types/bent" "^7.0.1" "@types/fs-extra" "^4.0.2" @@ -2841,136 +2275,144 @@ glob "^7.2.0" typescript "~4.5.5" -"@theia/markers@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.31.1.tgz#d760c9ef2a6d8113a99a5873c9ebb6babfc61ef9" - integrity sha512-ZSfvX4Dvg2xc+DzJmIxbz5AAngHuhcBEWeGdH2P57nrHTHczwa4yR8fEtqNhvE1MbCREHGcvd229TOz5UC7N2Q== +"@theia/markers@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/markers/-/markers-1.39.0.tgz#b196d4f275e98c1ee6465c195e433068bb749048" + integrity sha512-Eu87s02CjmBLO615wUvN8CTRltjbHVwYTT+hs9y+pVXjhlhfpswM4P9MQxIOx8XDSoL2D00VasIybwdq3hHQGQ== dependencies: - "@theia/core" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/workspace" "1.31.1" + "@theia/core" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/workspace" "1.39.0" -"@theia/messages@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.31.1.tgz#4792ad48a66125ed21661d37494fe87419c36e27" - integrity sha512-cwwySh2LIvWve99gt0iGaHiUESXFfSAgbD4XKcl34yg3ktlHX/ZZFf/PgEAlrvgLSufn5Z2NIdUKqefnemCy9Q== +"@theia/messages@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/messages/-/messages-1.39.0.tgz#6845a448227abf6eb71f5f3a29a7fde1d1e595f0" + integrity sha512-FAUeNjssuH1Xf/uGPs6f0XJijBULflAy5iJXL5qDkZQkH+cWLJsy+1QrsRN5nxg8Cw6HUDt96Oe8DMwsYkdqRQ== dependencies: - "@theia/core" "1.31.1" + "@theia/core" "1.39.0" react-perfect-scrollbar "^1.5.3" ts-md5 "^1.2.2" -"@theia/monaco-editor-core@1.67.2": - version "1.67.2" - resolved "https://registry.yarnpkg.com/@theia/monaco-editor-core/-/monaco-editor-core-1.67.2.tgz#d89163fa4f15560e72413791dc6a406a7c732807" - integrity sha512-KjDqHiTSOvnQOkV5qOJaUYwOaMjzpbqJZNRi0RKlBkCjcd/wjGlu5kjsgSDu6BbMnk51oQ9GgoDq/ppjJVaa7A== - -"@theia/monaco@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.31.1.tgz#695a50fc9ff6c22b56c4665d7756bd16f3f05c51" - integrity sha512-MMPbLH8M52q7sj0ftb5DIB9FzRJNcQVbEPyOQT6Sahm0/Wq3NoKd1sl/GcRRXH+hPKlqnyZhYSdgniJK0/zD+w== - dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/markers" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" - "@theia/outline-view" "1.31.1" +"@theia/monaco-editor-core@1.72.3": + version "1.72.3" + resolved "https://registry.yarnpkg.com/@theia/monaco-editor-core/-/monaco-editor-core-1.72.3.tgz#911d674c6e0c490442a355cfaa52beec919a025e" + integrity sha512-2FK5m0G5oxiqCv0ZrjucMx5fVgQ9Jqv0CgxGvSzDc4wRrauBdeBoX90J99BEIOJ8Jp3W0++GoRBdh0yQNIGL2g== + +"@theia/monaco@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/monaco/-/monaco-1.39.0.tgz#b1943d4d94022969c3401711a45f08b497520625" + integrity sha512-fbEC27l7H0D8D968J6i+wn5wFMsmbGQpYOt/fPGdda7cCxxYlb7vy3krYbDn8EvHRMEF+2OCVydcOF41u81RxA== + dependencies: + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/markers" "1.39.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/outline-view" "1.39.0" fast-plist "^0.1.2" idb "^4.0.5" jsonc-parser "^2.2.0" vscode-oniguruma "1.6.1" - vscode-textmate "7.0.1" - -"@theia/navigator@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.31.1.tgz#d102e135fcd43964095eade5d5edbee2a903c82b" - integrity sha512-G/g36vOwe7vaPeUhDUwZfMRJv3AM3I6p1OidTC2h6ipSJuRpg8ZVnD58CeopdZ1wVmxjuYxc2pviiAb0SVeUig== - dependencies: - "@theia/core" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/workspace" "1.31.1" - minimatch "^3.0.4" - -"@theia/outline-view@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.31.1.tgz#e845b02bd4ad70f201767d858e5210f42ceba229" - integrity sha512-mHpFnX0lZm4P5qxqL6wDeHqyMymZVr9xZzbdtr2IX7M1VlHEgjyUIyz0TU0uO//FUZQT6NW/u88pcgBclPCvsw== - dependencies: - "@theia/core" "1.31.1" + vscode-textmate "^7.0.3" -"@theia/output@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.31.1.tgz#75e02ddef3b472b6eef24f74e38445d02facc641" - integrity sha512-0DPCbi6Th5QdS5gklHfK7zkX7pEcZ0NpJvIwu2jRL1kYCM0bdzuhznJM9rlapKboHbot7CdfuDScV29gK1OOUA== +"@theia/native-webpack-plugin@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/native-webpack-plugin/-/native-webpack-plugin-1.39.0.tgz#3945a414d567d39448a6853feab97a637c3f1927" + integrity sha512-SOm8bBHjkHtKfocoA5pfz7b3c07SUVQWpd9JQnxDVETsVnBE64T/sEVtuR/JWMHSH5I+Znx4mQ47/vmsBNLGQQ== dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/monaco" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" + temp "^0.9.1" + webpack "^5.76.0" + +"@theia/navigator@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/navigator/-/navigator-1.39.0.tgz#b76a6cf72d691576a385905499e673e39f41ef9a" + integrity sha512-4AET4BOrEdZ/kmADL0n8hm6iTy0rA7QaqwkNJfSNxW1fNkLmnfZ4zkAGb7G7z7NEAiT8x6+HkiOKxcRqm1F/jA== + dependencies: + "@theia/core" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/workspace" "1.39.0" + minimatch "^5.1.0" + +"@theia/outline-view@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/outline-view/-/outline-view-1.39.0.tgz#1b4a9032730164f646dbd0d7a8b4d94b38a6d9bc" + integrity sha512-zFwxWsJmSFUxnZyC+NwWcq1P7XOOLl0or30jSZGXgIvLVBVL/5QT8Uiaxi750SpAPCl4S1zfGYYXaGWqcj2YCg== + dependencies: + "@theia/core" "1.39.0" + +"@theia/output@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/output/-/output-1.39.0.tgz#d1c379d7893391f8a3f7ed46130c4a376a8204f2" + integrity sha512-MeIRpn63p5ykctpPsfNLonKOasPmvIOJ3/q7sEjOCK0QRGwxI5WoTVNjBYEEvAleZCVO2B0OsvKoo6EjDE4yhA== + dependencies: + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/monaco" "1.39.0" + "@theia/monaco-editor-core" "1.72.3" "@types/p-queue" "^2.3.1" p-queue "^2.4.2" -"@theia/ovsx-client@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/ovsx-client/-/ovsx-client-1.31.1.tgz#878e1dc088a136d58c3fa5fb57c631ea89b0d703" - integrity sha512-/A+kjPn+52OS9zN3iXN46yAIeydqq+BZYqKX/vOfsrYGhIYKdq6sb6SKp+LyHM+YQohkL+9SuW9wtGnb27PSzA== +"@theia/ovsx-client@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/ovsx-client/-/ovsx-client-1.39.0.tgz#4dd3929c7ee05687fd9655a6f37ea6039c943d69" + integrity sha512-vfIAHbt66D0sbujQrQxg0KbIBU0nXexVwluHhpn9m28fgkRA+4lvNvAu0iIHu2OTWniO4CJvBzOyiALbSG10rQ== dependencies: - "@theia/request" "1.31.1" + "@theia/request" "1.39.0" semver "^5.4.1" -"@theia/plugin-ext-vscode@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.31.1.tgz#e0e814e923b668d655fd4f7b3a643b9c637c2f0c" - integrity sha512-n9dcernVXpYiajOWABHVkmqJMtfF+tWEysXlw6B5byMfh69wJty83/5jDFnBgPvKfOSVysHXk+PiPVlU9yKUlw== - dependencies: - "@theia/callhierarchy" "1.31.1" - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/monaco" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" - "@theia/navigator" "1.31.1" - "@theia/plugin" "1.31.1" - "@theia/plugin-ext" "1.31.1" - "@theia/terminal" "1.31.1" - "@theia/typehierarchy" "1.31.1" - "@theia/userstorage" "1.31.1" - "@theia/workspace" "1.31.1" - "@types/request" "^2.0.3" +"@theia/plugin-ext-vscode@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext-vscode/-/plugin-ext-vscode-1.39.0.tgz#6e6a9e58b8c0f8f632039857591c756faf682220" + integrity sha512-91P9LXcylBnjSQxUnnHfhR262s89LiJ5sgvQS3xTRhHaxJI7d7YHYcQQaDRbaKyJBFLEGt4mNTEoREC9UsZZEw== + dependencies: + "@theia/callhierarchy" "1.39.0" + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/monaco" "1.39.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/navigator" "1.39.0" + "@theia/plugin" "1.39.0" + "@theia/plugin-ext" "1.39.0" + "@theia/terminal" "1.39.0" + "@theia/typehierarchy" "1.39.0" + "@theia/userstorage" "1.39.0" + "@theia/workspace" "1.39.0" filenamify "^4.1.0" - request "^2.82.0" - -"@theia/plugin-ext@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.31.1.tgz#1cf14081827f9404f4323f98c810eeffc4d1a6a1" - integrity sha512-DiSy3wbN66U1Iz549LT0X+9eUWIp6S2CzQ8PnYbbL5aOBpfIiBtiRbhAIQWRnhXoqMA9CPEHwKNomM6jfteVPQ== - dependencies: - "@theia/bulk-edit" "1.31.1" - "@theia/callhierarchy" "1.31.1" - "@theia/console" "1.31.1" - "@theia/core" "1.31.1" - "@theia/debug" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/file-search" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/markers" "1.31.1" - "@theia/messages" "1.31.1" - "@theia/monaco" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" - "@theia/navigator" "1.31.1" - "@theia/output" "1.31.1" - "@theia/plugin" "1.31.1" - "@theia/preferences" "1.31.1" - "@theia/scm" "1.31.1" - "@theia/search-in-workspace" "1.31.1" - "@theia/task" "1.31.1" - "@theia/terminal" "1.31.1" - "@theia/timeline" "1.31.1" - "@theia/typehierarchy" "1.31.1" - "@theia/variable-resolver" "1.31.1" - "@theia/workspace" "1.31.1" + +"@theia/plugin-ext@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/plugin-ext/-/plugin-ext-1.39.0.tgz#d715b613896c6f5f008cb014d21eb8bdb84044d0" + integrity sha512-1I37IGGPRLiCCLKjAMsEMBfkyQ0OZuObNDjQaEz8DJtWuTjF8pFQ+Ebr+XTgv5S10HwUt+VYq4Zw35G5Zy2dZg== + dependencies: + "@theia/bulk-edit" "1.39.0" + "@theia/callhierarchy" "1.39.0" + "@theia/console" "1.39.0" + "@theia/core" "1.39.0" + "@theia/debug" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/editor-preview" "1.39.0" + "@theia/file-search" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/markers" "1.39.0" + "@theia/messages" "1.39.0" + "@theia/monaco" "1.39.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/navigator" "1.39.0" + "@theia/output" "1.39.0" + "@theia/plugin" "1.39.0" + "@theia/preferences" "1.39.0" + "@theia/scm" "1.39.0" + "@theia/search-in-workspace" "1.39.0" + "@theia/task" "1.39.0" + "@theia/terminal" "1.39.0" + "@theia/timeline" "1.39.0" + "@theia/typehierarchy" "1.39.0" + "@theia/variable-resolver" "1.39.0" + "@theia/workspace" "1.39.0" "@types/mime" "^2.0.1" "@vscode/debugprotocol" "^1.51.0" + "@vscode/proxy-agent" "^0.13.2" decompress "^4.2.1" escape-html "^1.0.3" filenamify "^4.1.0" @@ -2980,154 +2422,154 @@ macaddress "^0.2.9" mime "^2.4.4" ps-tree "^1.2.0" - request "^2.82.0" semver "^5.4.1" uuid "^8.0.0" vhost "^3.0.2" - vscode-proxy-agent "^0.11.0" - vscode-textmate "7.0.1" - -"@theia/plugin@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.31.1.tgz#3490be98fcc5e7a5c05092fb05370daa9c22dc7a" - integrity sha512-G/+85xLS9k/eIB5LCXrZwMW+fQVdKcEgNVicoTWP98v5F5sdWTPmCAVFMaM5JnZcrqKaohbnPlcPccL8jpR0NA== - -"@theia/preferences@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.31.1.tgz#713bb62aa425a37d81f7da1316af51ba90332c29" - integrity sha512-GYhkAzCbfqg+TxFdIZsQYzyyN8mSmarHSbH2A1IBYwMBb6n7Nuj0Lz9guv5Jfj/lQLgNNAUC+0W3rBI957qa5Q== - dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/monaco" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" - "@theia/userstorage" "1.31.1" - "@theia/workspace" "1.31.1" + vscode-textmate "^7.0.3" + +"@theia/plugin@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/plugin/-/plugin-1.39.0.tgz#88e6e5c0720f20685362ac0983bd7c98af81a31c" + integrity sha512-5ORDIPYsB3ZrVjeHbeLIZ6lanhzvZZEyHwPLurPr6HTnQWivfgF0FEf7gSMxqLzY4qI/mxnKN/39wFEVjoCiYg== + +"@theia/preferences@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/preferences/-/preferences-1.39.0.tgz#4c7228fc646b85c5b9f8ede448820d4f312cc3b5" + integrity sha512-abO0EwpmyOD0DBRk1ReXF7jLd7aDjx5Und9tLbggrZs4dDpNsIvED5axwkA+mRTlq3gdnnVRCbBqP5HZQ3LxFA== + dependencies: + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/monaco" "1.39.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/userstorage" "1.39.0" + "@theia/workspace" "1.39.0" async-mutex "^0.3.1" + fast-deep-equal "^3.1.3" jsonc-parser "^2.2.0" p-debounce "^2.1.0" -"@theia/process@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.31.1.tgz#c53ea414f6cf9067772a98dd9a3fb76695475e59" - integrity sha512-gYHggBPb7UURmRgWyuYuHRuS/wEY9yn+Jw/5EVm1AkGG3KsgWeuPDyoPGf6/4aUy4ZjZGvng+Ohsc3qvAMOhaQ== +"@theia/process@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/process/-/process-1.39.0.tgz#5b0d4fb5ade9f8d550aab998d794a8645de0a141" + integrity sha512-Jm/pSNDshT09sS6GqQzRYQv7wArE7m31h7UoRksIsgVQM3xNmFOM080hkNhvvM3rTj6yGAVux5qfFZSXqBiAsg== dependencies: - "@theia/core" "1.31.1" + "@theia/core" "1.39.0" node-pty "0.11.0-beta17" string-argv "^0.1.1" -"@theia/request@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.31.1.tgz#23cdb2b0b83dfb0f978b530c0d6884fdf173da1b" - integrity sha512-zZELIFtqljuOcupIXdeiq021ADrRPsl6Cy1sOb11FQbqerng+Qt9NPLoVtNSZvsfES7RD0hQIgIFe/ciKXsZfg== +"@theia/request@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/request/-/request-1.39.0.tgz#961fcfa5912232d26958a7de55e93c959a8c0a74" + integrity sha512-kDfys8mVIgbVNCdgx/rDm1harEmhO3I1gNfJE49ysS1mfyKqKifpthtnEZRQha0za9hHyUG+eVIbx2Xhf4vBIg== dependencies: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" -"@theia/scm@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.31.1.tgz#4fed96272d99c6e55dd22e70313760c1a7fec2a0" - integrity sha512-8zNr2diGBLKc6+cgkvmQcmuwzgOBf3cO6UrbqZk/OyO6ew6dyDyXkzhYt6hMcWO0inj4eNp8aJCtHDZSdZMIEQ== +"@theia/scm@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/scm/-/scm-1.39.0.tgz#c9623798858294328eca539a6d26b1bc17179764" + integrity sha512-MLkMpfLSWRMeVigqsLY0eg0P0MTSxDnnC1ZfxcFHtfdXV7Qo3CMRO63Be+t6aexL6Z7OMMo6kTiUTTk37iwOuw== dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/filesystem" "1.31.1" + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/filesystem" "1.39.0" "@types/diff" "^3.2.2" diff "^3.4.0" p-debounce "^2.1.0" react-autosize-textarea "^7.0.0" ts-md5 "^1.2.2" -"@theia/search-in-workspace@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.31.1.tgz#aeec4e62225a818c97b9a5bb48f5960726b6b1a5" - integrity sha512-FxgZFW06/bVH6J9U+oWNQ38samjkYIbwA8QxNkQF7DiY+4bXxpy7b+nQg4EM55CEaT0l0qX/Eq5qZ7eLm0M2ug== - dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/navigator" "1.31.1" - "@theia/process" "1.31.1" - "@theia/workspace" "1.31.1" +"@theia/search-in-workspace@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/search-in-workspace/-/search-in-workspace-1.39.0.tgz#cc0e3e64c035e1b9ebd551d3a2c268d2beff8071" + integrity sha512-kawf+IXhnzJwvrRLqHBbTZTczfusn5+sFRIOmiaQ09v4pUihrr+9TZ2HJUdbqQdl8W8iL3vNkURT0IsLMzMm1A== + dependencies: + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/navigator" "1.39.0" + "@theia/process" "1.39.0" + "@theia/workspace" "1.39.0" "@vscode/ripgrep" "^1.14.2" - minimatch "^3.0.4" - -"@theia/task@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.31.1.tgz#2989a36f3d65a830be5a5a540453148f7238e708" - integrity sha512-936o37x/GPSgymUPCOPs3viY/0NQ1cnYvGGT5q+pTkTsE1JvIIWQRDrMwlx0p5Sey2OxEPj1BUM3UIF6pmzFGA== - dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/markers" "1.31.1" - "@theia/monaco" "1.31.1" - "@theia/monaco-editor-core" "1.67.2" - "@theia/process" "1.31.1" - "@theia/terminal" "1.31.1" - "@theia/userstorage" "1.31.1" - "@theia/variable-resolver" "1.31.1" - "@theia/workspace" "1.31.1" + minimatch "^5.1.0" + +"@theia/task@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/task/-/task-1.39.0.tgz#4f1bef9ea2337c9aa89c9f001c15ff5afb7153ab" + integrity sha512-ZhaiRTuxXbJxLxijeDxBjR8ycgCC301iS0nW0UHpi8ReqPoL7u+ZEQUUW631rSEV4m8Ve1PXamEjPt6ZGyAoFg== + dependencies: + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/markers" "1.39.0" + "@theia/monaco" "1.39.0" + "@theia/monaco-editor-core" "1.72.3" + "@theia/process" "1.39.0" + "@theia/terminal" "1.39.0" + "@theia/userstorage" "1.39.0" + "@theia/variable-resolver" "1.39.0" + "@theia/workspace" "1.39.0" async-mutex "^0.3.1" jsonc-parser "^2.2.0" p-debounce "^2.1.0" -"@theia/terminal@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.31.1.tgz#5d6684592fbb126b1b64e6037719456175c41aff" - integrity sha512-5NCo/3rCp0eCxrUQYC+AAo4W7XFdUZoxUV+isd1MSbcHxhKQAM2r6f2ILK98DBs5zZCu6gvxYqtjZ+nuhcrz0A== - dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/process" "1.31.1" - "@theia/workspace" "1.31.1" +"@theia/terminal@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/terminal/-/terminal-1.39.0.tgz#5ed6cebe70bfa25be2a447923b31d1118f1bc541" + integrity sha512-a33ziDuLx+hF/3GvICvGTMBTdwQr96iUsiqBBDBNwIXoCIvG5Q33Pds0xNyH34Ik8XXRLSSWgyTiGK2eM6qreQ== + dependencies: + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/process" "1.39.0" + "@theia/variable-resolver" "1.39.0" + "@theia/workspace" "1.39.0" xterm "^4.16.0" xterm-addon-fit "^0.5.0" xterm-addon-search "^0.8.2" -"@theia/timeline@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.31.1.tgz#ed886d900b3e914eced0a1d81b1670cd17ff6591" - integrity sha512-BaOPnbriN4SboRPpP+GCyTjOGNG6aVeSgdUyVktIK1v0bh2p/1MU/JKjKYSy0AN/qyHgUHAm/MpA1fA/EibaTA== +"@theia/timeline@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/timeline/-/timeline-1.39.0.tgz#2d5e59915b11296fa230d0d8549bb8a02ef5f83b" + integrity sha512-NZUfguj/BDoy5Ui/zBL7qb9eMOxRd6MRYYac3v4mHri5QqfUuTkiWdP9sDyrzMp/6x3NPKWzE/FwKSkHCaxFEw== dependencies: - "@theia/core" "1.31.1" - "@theia/navigator" "1.31.1" + "@theia/core" "1.39.0" + "@theia/navigator" "1.39.0" -"@theia/typehierarchy@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/typehierarchy/-/typehierarchy-1.31.1.tgz#60de77be85e0abb1c4c1ad4976c4572d635c1edb" - integrity sha512-8QTAG9mDUEsDOCdmeAMfS00NruGioeRVaLXwnA8j15XQEY67GzxFVVYfn332yjOwmaVj/1+bnPCdz/SVEMYfKQ== +"@theia/typehierarchy@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/typehierarchy/-/typehierarchy-1.39.0.tgz#970cfe009d60e87c97f59c3e0e483eab25c4fceb" + integrity sha512-rcikNT9NqOX70Cbx53Hus81pMGfwvtj5o0KhDCYw6EIBcSmMDz2BvQPptwdJrVQVs8oM7yjutpePuk460X0fsw== dependencies: - "@theia/core" "1.31.1" - "@theia/editor" "1.31.1" + "@theia/core" "1.39.0" + "@theia/editor" "1.39.0" "@types/uuid" "^7.0.3" uuid "^8.0.0" -"@theia/userstorage@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.31.1.tgz#72dc83aec9aae56d5fe4be0b332173e823926f49" - integrity sha512-75U15r3H/u7mzHIATRwX2n/MxKN6N4G2wJCcsrkqi2VMeHparz1i9HLQhvNfsc4yUSQqTBo9d1Zsjq6s+FWttw== +"@theia/userstorage@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/userstorage/-/userstorage-1.39.0.tgz#774d4a9f9f29ce4f092cd1e3493cd879cdb2f732" + integrity sha512-2zuXUQpakhjZY5VS5I1v4kO05TP6yK7tsgKSQWblddQIK9sO/IlfwdEbIjbrWpyPcFZuQzaCL+TCuWz1ryFfzQ== dependencies: - "@theia/core" "1.31.1" - "@theia/filesystem" "1.31.1" + "@theia/core" "1.39.0" + "@theia/filesystem" "1.39.0" -"@theia/variable-resolver@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.31.1.tgz#76002d229e5e0cdbcc0ce16ebc0dabe8bc18a0b9" - integrity sha512-sp8Ep2n35LURPmJa8aiRBDXu4zgnUP4fYMFAvgE+BLDwGep52/BMNHOgiNHvuV87ex10+ZquD6eGe93w1udJ8w== +"@theia/variable-resolver@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/variable-resolver/-/variable-resolver-1.39.0.tgz#89463838476ab912ad9e1c6ccb8ce33b35f149dd" + integrity sha512-7JUMayOJekDcQbVGs2K1XhmDb+zlGL1n1bSwVC1K9/MxPlrcmoevEvMz36qboP+J6ym/S3kNchrth9lo0uxO9A== dependencies: - "@theia/core" "1.31.1" + "@theia/core" "1.39.0" -"@theia/workspace@1.31.1": - version "1.31.1" - resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.31.1.tgz#4686fe3ef2111218f6daf20e7d9e6c25211edce0" - integrity sha512-SOwpy3ApPPLsT1mrBgK01FdPuNBo41X5ecBg++fRIWSVxgFtshp1JDla32GReDG39R4wbY/i/SDGHkvNq00dSA== +"@theia/workspace@1.39.0": + version "1.39.0" + resolved "https://registry.yarnpkg.com/@theia/workspace/-/workspace-1.39.0.tgz#bb29c466141b5584f3ae078cf658d5547950a4c9" + integrity sha512-3/mFMvgdkKj8+DPaWUGD0vQlFFlx7k6WKp5nAtOXz2DZSAb/wXlqH+ex0MgPtJZyCccg+YdVeoWW19Gpp6YWOA== dependencies: - "@theia/core" "1.31.1" - "@theia/filesystem" "1.31.1" - "@theia/variable-resolver" "1.31.1" + "@theia/core" "1.39.0" + "@theia/filesystem" "1.39.0" + "@theia/variable-resolver" "1.39.0" jsonc-parser "^2.2.0" valid-filename "^2.0.1" @@ -3138,6 +2580,11 @@ dependencies: tippy.js "^6.3.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" @@ -3148,15 +2595,28 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@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== + version "9.21.0" + resolved "https://registry.yarnpkg.com/@types/auth0-js/-/auth0-js-9.21.0.tgz#48873f718e3ec75f30e5734b74e4d07356fa2bba" + integrity sha512-tnF0BKFwI+Vzqwb9p7KgpaKStg/WHqbiGWz5GPpn+ZeBvJ1iY7NkmeNJUsHIN/4c7CF2zr8FT5JRhs3F5aAPNw== "@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.3" + resolved "https://registry.yarnpkg.com/@types/bent/-/bent-7.3.3.tgz#b8daa06e72219045b3f67f968d590d3df3875d96" + integrity sha512-5NEIhVzHiZ6wMjFBmJ3gwjxwGug6amMoAn93rtDBttwrODxm+bt63u+MJA7H9NGGM4X1m73sJrAxDapktl036Q== dependencies: "@types/node" "*" @@ -3176,31 +2636,19 @@ "@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/responselike" "^1.0.0" -"@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/chai@^4.2.7": + version "4.3.5" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" + integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== "@types/connect@*": version "3.4.35" @@ -3220,38 +2668,33 @@ 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.13" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" + integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== + 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.8" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" + integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== dependencies: "@types/ms" "*" -"@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/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" "*" @@ -3264,44 +2707,40 @@ "@types/estree" "*" "@types/eslint@*": - version "8.4.5" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4" - integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ== + version "8.44.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.0.tgz#55818eabb376e2272f77fbf5c96c43137c3c1e53" + integrity sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@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.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== "@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.18": - version "4.17.29" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" - integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q== +"@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== 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== + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" + "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" "@types/serve-static" "*" @@ -3312,7 +2751,22 @@ dependencies: "@types/node" "*" -"@types/glob@*", "@types/glob@^7.1.1", "@types/glob@^7.2.0": +"@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@*": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== + dependencies: + "@types/minimatch" "^5.1.2" + "@types/node" "*" + +"@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== @@ -3326,55 +2780,42 @@ integrity sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw== "@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.5" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.5.tgz#08caac88b44d0fdd04dc17a19142355f43bd8a7a" + integrity sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg== dependencies: - "@types/unist" "*" + "@types/unist" "^2" -"@types/http-cache-semantics@*": +"@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.1": 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-errors@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + "@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== -"@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.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-21.1.1.tgz#e59e26352071267b507bf04d51841a1d7d3e8617" + integrity sha512-cZFuoVLtzKP3gmq9eNosUL1R50U+USkbLtUQ1bYVgl/lKp0FZM7Cq4aIHAL8oIvQ17uSHi7jXPtfDOdjPwBE7A== dependencies: - "@types/events" "*" "@types/node" "*" "@types/tough-cookie" "*" - parse5 "^4.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/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + parse5 "^7.0.0" -"@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.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== -"@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== @@ -3408,9 +2849,9 @@ "@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== + version "4.14.195" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== "@types/long@^4.0.1": version "4.0.2" @@ -3426,21 +2867,21 @@ "@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.12" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.12.tgz#beeb511b977c875a5b0cc92eab6fcac2f0895514" + integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== dependencies: - "@types/unist" "*" + "@types/unist" "^2" -"@types/mdurl@*", "@types/mdurl@^1.0.0": +"@types/mdurl@*": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== -"@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/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== "@types/mime@^1": version "1.3.2" @@ -3452,7 +2893,12 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== -"@types/minimatch@*", "@types/minimatch@^3.0.3": +"@types/minimatch@*", "@types/minimatch@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@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== @@ -3462,6 +2908,11 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== +"@types/mocha@^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" + integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== + "@types/mocha@^5.2.7": version "5.2.7" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" @@ -3480,22 +2931,22 @@ "@types/express" "*" "@types/node-fetch@^2.5.7": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" - integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== + version "2.6.4" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" + integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== dependencies: "@types/node" "*" form-data "^3.0.0" "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.6.tgz#0ba49ac517ad69abe7a1508bc9b3a5483df9d5d7" - integrity sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw== + version "20.4.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" + integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== -"@types/node@^14.6.2": - version "14.18.22" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.22.tgz#fd2a15dca290fc9ad565b672fde746191cd0c6e6" - integrity sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw== +"@types/node@^16.11.26": + version "16.18.38" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.38.tgz#1dcdb6c54d02b323f621213745f2e44af30c73e6" + integrity sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3512,6 +2963,14 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/plist@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01" + integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw== + 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" @@ -3522,13 +2981,6 @@ 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" "*" - "@types/qs@*": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" @@ -3540,9 +2992,9 @@ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-dom@^18.0.6": - version "18.0.11" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33" - integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw== + version "18.2.7" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" + integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== dependencies: "@types/react" "*" @@ -3554,9 +3006,9 @@ "@types/react" "*" "@types/react-transition-group@^4.4.0": - version "4.4.5" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" - integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== + version "4.4.6" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e" + integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== dependencies: "@types/react" "*" @@ -3567,35 +3019,16 @@ dependencies: "@types/react" "*" -"@types/react@*": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.0.tgz#4be8aa3a2d04afc3ac2cc1ca43d39b0bd412890c" - integrity sha512-7+K7zEQYu7NzOwQGLR91KwWXXDzmTFODRVizJyIALf6RfLv2GDpqpknX64pvRVILXCpXi7O/pua8NGk44dLvJw== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^18.0.15": - version "18.0.28" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065" - integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew== +"@types/react@*", "@types/react@^18.0.15": + version "18.2.15" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.15.tgz#14792b35df676c20ec3cf595b262f8c615a73066" + integrity sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA== 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": +"@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== @@ -3623,32 +3056,36 @@ "@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== + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== "@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.10" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.10.tgz#5f19ee40cbeff87d916eedc8c2bfe2305d957f73" - integrity sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw== +"@types/semver@^7.3.12", "@types/semver@^7.3.6", "@types/semver@^7.3.8": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== -"@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.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== dependencies: "@types/mime" "^1" "@types/node" "*" -"@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/serve-static@*": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" "@types/tar-fs@^1.16.1": version "1.16.3" @@ -3678,24 +3115,29 @@ integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== "@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.3" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" + integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== -"@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.7" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.7.tgz#5b06ad6894b236a1d2bd6b2f07850ca5c59cf4d6" + integrity sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g== "@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/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.6" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.6.tgz#3e600c62d210c5826460858f84bcbb65805460bb" + integrity sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ== + +"@types/vscode@^1.78.0": + version "1.80.0" + resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.80.0.tgz#e004dd6cde74dafdb7fab64a6e1754bf8165b981" + integrity sha512-qK/CmOdS2o7ry3k6YqU4zD3R2AYlJfbwBoSbKpBoP+GpXNE+0NEgJOli4n0bm0diK5kfBnchgCEj4igQz/44Hg== "@types/write-json-file@^2.2.1": version "2.2.1" @@ -3716,81 +3158,109 @@ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@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.15" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== 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/yargs@^17.0.1": + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== 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/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@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/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/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: - "@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-scope "^5.1.1" - eslint-utils "^3.0.0" + "@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/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/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/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" + "@typescript-eslint/visitor-keys" "5.62.0" -"@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== +"@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/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" -"@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== +"@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/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== +"@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: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.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" + semver "^7.3.7" -"@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== +"@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/types" "4.33.0" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" "@virtuoso.dev/react-urx@^0.2.12": version "0.2.13" @@ -3805,142 +3275,163 @@ integrity sha512-iirJNv92A1ZWxoOHHDYW/1KPoi83939o83iUBQHIim0i3tMeSKEh+bxhJdTHQ86Mr4uXx9xGUTq69cp52ZP8Xw== "@vscode/codicons@*": - version "0.0.31" - resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.31.tgz#1dc56f9442c3928b1c851965cf360e7e051e6511" - integrity sha512-fldpXy7pHsQAMlU1pnGI23ypQ6xLk5u6SiABMFoAmlj4f2MR0iwg7C19IB1xvAEGG+dkxOfRSrbKF8ry7QqGQA== + version "0.0.33" + resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.33.tgz#a56243ab5492801fff04e53c0aab0d18a6521751" + integrity sha512-VdgpnD75swH9hpXjd34VBgQ2w2quK63WljodlUcOoJDPKiV+rPjHrcUc2sjLCNKxhl6oKqmsZgwOWcDAY2GKKQ== "@vscode/debugprotocol@^1.51.0": - version "1.57.0" - resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.57.0.tgz#f055c0422b1f77358a12b1415623099ba0541647" - integrity sha512-eww0WhAtj3lPX7+7tGkxQ3P7IRC3hS7+SVL7fmM8CAat2DMM+PVjg1FQbTCtMw6EwNSmT/qMx1iZCyzQguJJKA== + version "1.61.0" + resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.61.0.tgz#82bbcaba5a925f1f58246c9f50b669855c9f23f9" + integrity sha512-K/kF27jIStVFqlmUaGc2u+Dj8IR7YdEiSqShWr7MWhDudqpAW7uu7XMwoFwjpuC9LSaVwJMIX7EFC5OJ/RmnDQ== + +"@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: + "@tootallnate/once" "^1.1.2" + agent-base "^6.0.2" + debug "^4.3.1" + 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" "@vscode/ripgrep@^1.14.2": - version "1.14.2" - resolved "https://registry.yarnpkg.com/@vscode/ripgrep/-/ripgrep-1.14.2.tgz#47c0eec2b64f53d8f7e1b5ffd22a62e229191c34" - integrity sha512-KDaehS8Jfdg1dqStaIPDKYh66jzKd5jy5aYEPzIv0JYFLADPsCSQPBUdsJVXnr0t72OlDcj96W05xt/rSnNFFQ== + version "1.15.5" + resolved "https://registry.yarnpkg.com/@vscode/ripgrep/-/ripgrep-1.15.5.tgz#26025884bbc3a8b40dfc29f5bda4b87b47bd7356" + integrity sha512-PVvKNEmtnlek3i4MJMaB910dz46CKQqcIY2gKR3PSlfz/ZPlSYuSuyQMS7iK20KL4hGUdSbWt964B5S5EIojqw== dependencies: https-proxy-agent "^5.0.0" proxy-from-env "^1.1.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== +"@vscode/windows-ca-certs@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@vscode/windows-ca-certs/-/windows-ca-certs-0.3.1.tgz#35c88b2d2a52f7759bfb6878906c3d40421ec6a3" + integrity sha512-1B6hZAsqg125wuMsXiKIFkBgKx/J7YR4RT/ccYGkWAToPU9MVa40PRe+evLFUmLPH6NmPohEPlCzZLbqgvHCcQ== + dependencies: + node-addon-api "^3.0.2" + +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@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.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== -"@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.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@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.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== -"@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.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@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.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@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.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== 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.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" -"@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.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== 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.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== 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/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== - 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/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== - 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/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== - 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/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== - dependencies: - "@webassemblyjs/ast" "1.11.1" +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.0.3": @@ -3960,6 +3451,85 @@ 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.9" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.9.tgz#b6ef7457e826be8049667ae673eda7876eb049be" + integrity sha512-4VSbbcMoxc4KLjb1gs96SRmi7w4h1SF+fCoiK0XaQX62buCc1G5d0DC5bJ9xJBNPDSVCmIrcl8BiYxzjrqaaJA== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -3975,10 +3545,10 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -"@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0-rc.32" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.32.tgz#0aef0bd1b9e9954173c01a7cbd35f98765e39e7d" - integrity sha512-Sz2g88b3iAu2jpMnhtps2bRX2GAAOvanOxGcVi+o7ybGjLetxK23o2cHskXKypvXxtZTsJegel5pUWSPpYphww== +"@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" @@ -3990,7 +3560,7 @@ dependencies: argparse "^2.0.1" -JSONStream@^1.0.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== @@ -3998,7 +3568,7 @@ JSONStream@^1.0.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== @@ -4016,59 +3586,39 @@ 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 "^8.1.0" + acorn-walk "^8.0.2" -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-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== -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-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -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.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== +acorn@^8.1.0, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== 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== -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== - agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -4077,12 +3627,12 @@ agent-base@6, agent-base@^6.0.2: debug "4" 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== + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== dependencies: debug "^4.1.0" - depd "^1.1.2" + depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -4093,6 +3643,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" @@ -4100,19 +3658,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== @@ -4122,10 +3680,10 @@ 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.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -4219,6 +3777,11 @@ ansi-colors@3.2.3: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-colors@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-0.2.0.tgz#72c31de2a0d9a2ccd0cac30cc9823eeb2f6434b5" @@ -4354,6 +3917,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-reset@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-reset/-/ansi-reset-0.1.1.tgz#e7e71292c3c7ddcd4d62ef4a6c7c05980911c3b7" @@ -4382,6 +3950,16 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +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== + +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== + ansi-underline@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-underline/-/ansi-underline-0.1.1.tgz#dfc920f4c97b5977ea162df8ffb988308aaa71a4" @@ -4408,15 +3986,7 @@ ansi-yellow@^0.1.1: dependencies: ansi-wrap "0.1.0" -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== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -anymatch@~3.1.2: +anymatch@~3.1.1, 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== @@ -4424,6 +3994,43 @@ anymatch@~3.1.2: 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@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-23.6.0.tgz#03cade02838c077db99d86212d61c5fc1d6da1a8" + integrity sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA== + dependencies: + "7zip-bin" "~5.1.1" + "@develar/schema-utils" "~2.6.5" + "@electron/universal" "1.2.1" + "@malept/flatpak-bundler" "^0.4.0" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + chromium-pickle-js "^0.2.0" + debug "^4.3.4" + ejs "^3.1.7" + electron-osx-sign "^0.6.0" + electron-publish "23.6.0" + form-data "^4.0.0" + fs-extra "^10.1.0" + hosted-git-info "^4.1.0" + is-ci "^3.0.0" + isbinaryfile "^4.0.10" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^3.1.2" + read-config-file "6.2.0" + sanitize-filename "^1.6.3" + semver "^7.3.7" + tar "^6.1.11" + 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" @@ -4434,23 +4041,24 @@ aproba@^1.0.3: 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== +ardunno-cli@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ardunno-cli/-/ardunno-cli-0.1.3.tgz#d86fd3e33a31c3fa3287017eee08537617446500" + integrity sha512-ijOX990uZJ7Di6iv+heFK4FrYzSbW2NkGBssM2ttolFkr0LHDcZNpF3CPonvenLY54TdD6VWcqQ4Gg9xvuWhAg== + dependencies: + nice-grpc-common "^2.0.2" + protobufjs "^7.2.3" + are-we-there-yet@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" @@ -4460,9 +4068,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" @@ -4502,16 +4110,19 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + 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-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-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -4522,15 +4133,15 @@ 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.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: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" array-sort@^0.1.4: @@ -4542,7 +4153,7 @@ array-sort@^0.1.4: 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== @@ -4564,27 +4175,60 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -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.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" -array.prototype.reduce@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f" - integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -4595,19 +4239,29 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== +arrify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc" + integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== + 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== +asar@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221" + integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg== dependencies: - safer-buffer "~2.1.0" + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" -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== @@ -4637,10 +4291,10 @@ 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-mutex@^0.3.0, async-mutex@^0.3.1: version "0.3.2" @@ -4649,6 +4303,13 @@ async-mutex@^0.3.0, async-mutex@^0.3.1: dependencies: tslib "^2.3.1" +async-mutex@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.0.tgz#ae8048cd4d04ace94347507504b3cf15e631c25f" + integrity sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA== + dependencies: + tslib "^2.4.0" + async@^3.2.3: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" @@ -4675,15 +4336,16 @@ atomically@^1.7.0: 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== + version "9.22.0" + resolved "https://registry.yarnpkg.com/auth0-js/-/auth0-js-9.22.0.tgz#5b17632e547fa69e3755d9e5bae1cbea072c0e97" + integrity sha512-gyqxSyftzF8TK1sooPEk8DsP/I7bMMJi3lx8nnDZor8LjUXKr1kP40pLd0YzIDESO9sKu5TD2QMBooykc5bSZg== dependencies: base64-js "^1.5.1" idtoken-verifier "^2.2.2" 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" @@ -4699,15 +4361,10 @@ autosize@^4.0.2: resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.4.tgz#924f13853a466b633b9309330833936d8bccce03" integrity sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ== -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== +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== axios-cookiejar-support@^1.0.1: version "1.0.1" @@ -4725,31 +4382,29 @@ axios@^0.21.1: follow-redirects "^1.14.0" axios@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.1.tgz#44cf04a3c9f0c2252ebd85975361c026cb9f864a" - integrity sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A== + version "1.4.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" proxy-from-env "^1.1.0" +b4a@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9" + integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== + 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.3.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== dependencies: find-cache-dir "^3.3.1" loader-utils "^2.0.0" 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-macros@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" @@ -4759,29 +4414,29 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-polyfill-corejs2@^0.3.1: - 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.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz#9f9a0e1cd9d645cc246a5e094db5c3aa913ccd2b" + integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA== 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.4.1" + "@nicolo-ribaudo/semver-v6" "^6.3.3" -babel-plugin-polyfill-corejs3@^0.5.2: - 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.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz#d406c5738d298cd9c66f64a94cf8d5904ce4cc5e" + integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.21.0" + "@babel/helper-define-polyfill-provider" "^0.4.1" + core-js-compat "^3.31.0" -babel-plugin-polyfill-regenerator@^0.3.1: - 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.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz#ace7a5eced6dff7d5060c335c52064778216afd3" + integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/helper-define-polyfill-provider" "^0.4.1" bail@^2.0.0: version "2.0.2" @@ -4816,17 +4471,10 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -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" - 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== + 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" @@ -4847,24 +4495,12 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -bin-links@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-3.0.3.tgz#3842711ef3db2cd9f16a5f404a996a12db355a6e" - integrity sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA== - dependencies: - cmd-shim "^5.0.0" - mkdirp-infer-owner "^2.0.0" - npm-normalize-package-bin "^2.0.0" - read-cmd-shim "^3.0.0" - rimraf "^3.0.0" - write-file-atomic "^4.0.0" - 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== -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== @@ -4896,15 +4532,27 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +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.0, 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== + bluebird@~3.4.1: version "3.4.7" 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.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" content-type "~1.0.4" @@ -4914,11 +4562,29 @@ body-parser@1.20.0, body-parser@^1.17.2, body-parser@^1.18.3: http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.10.3" + qs "6.11.0" raw-body "2.5.1" type-is "~1.6.18" unpipe "1.0.0" +body-parser@^1.17.2, body-parser@^1.18.3: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + 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.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + boolean@^3.0.1: version "3.2.0" resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" @@ -4962,25 +4628,20 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.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: 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.21.2: - version "4.21.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.2.tgz#59a400757465535954946a400b841ed37e2b4ecf" - integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA== +browserslist@^4.14.5, browserslist@^4.21.9: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: - caniuse-lite "^1.0.30001366" - electron-to-chromium "^1.4.188" - node-releases "^2.0.6" - update-browserslist-db "^1.0.4" + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" btoa@^1.2.1: version "1.2.1" @@ -5005,6 +4666,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.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ== + buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" @@ -5020,7 +4686,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== @@ -5049,6 +4715,37 @@ builder-util-runtime@8.9.2: debug "^4.3.2" sax "^1.2.4" +builder-util-runtime@9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz#2da7b34e78a64ad14ccd070d6eed4662d893bd60" + integrity sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw== + dependencies: + debug "^4.3.4" + sax "^1.2.4" + +builder-util@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-23.6.0.tgz#1880ec6da7da3fd6fa19b8bd71df7f39e8d17dd9" + integrity sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ== + dependencies: + "7zip-bin" "~5.1.1" + "@types/debug" "^4.1.6" + "@types/fs-extra" "^9.0.11" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.1.1" + chalk "^4.1.1" + cross-spawn "^7.0.3" + debug "^4.3.4" + fs-extra "^10.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + 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" @@ -5068,10 +4765,10 @@ busboy@^1.0.0: dependencies: streamsearch "^1.1.0" -byte-size@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.1.tgz#b1daf3386de7ab9d706b941a748dbfc71130dee3" - integrity sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A== +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" @@ -5083,53 +4780,23 @@ bytesish@^0.4.1: resolved "https://registry.yarnpkg.com/bytesish/-/bytesish-0.4.4.tgz#f3b535a0f1153747427aee27256748cff92347e6" integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== -cacache@^16.0.0, cacache@^16.0.6: - 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" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" - tar "^6.1.11" - unique-filename "^2.0.0" - -cacache@^16.1.0: - version "16.1.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.1.tgz#4e79fb91d3efffe0630d5ad32db55cc1b870669c" - integrity sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg== +cacache@^17.0.0: + version "17.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" + integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" lru-cache "^7.7.1" - minipass "^3.1.6" + minipass "^5.0.0" minipass-collect "^1.0.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" + ssri "^10.0.0" tar "^6.1.11" - unique-filename "^1.1.1" + unique-filename "^3.0.0" cache-base@^1.0.1: version "1.0.1" @@ -5151,36 +4818,28 @@ cacheable-lookup@^5.0.3: 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.12" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.12.tgz#05b97a3199d1ee65c360eb45c5af6191faa3ab6b" + integrity sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw== + dependencies: + "@types/http-cache-semantics" "^4.0.1" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.2" + 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" @@ -5198,11 +4857,6 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -call-me-maybe@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" - integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -5235,10 +4889,15 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001366: - version "1.0.30001368" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001368.tgz#c5c06381c6051cd863c45021475434e81936f713" - integrity sha512-wgfRYa9DenEomLG/SdWgQxpIyvdtH3NW8Vq+tB6AwR9e56iOIcu1im5F/wNdDf04XlKHXqIx4N8Jo0PemeBenQ== +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.30001503: + version "1.0.30001516" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz#621b1be7d85a8843ee7d210fd9d87b52e3daab3a" + integrity sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g== capital-case@^1.0.4: version "1.0.4" @@ -5254,29 +4913,14 @@ 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== + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" - deep-eql "^3.0.1" + deep-eql "^4.1.2" get-func-name "^2.0.0" loupe "^2.3.1" pathval "^1.1.1" @@ -5355,6 +4999,11 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== +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.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" @@ -5370,7 +5019,7 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" -chokidar@^3.5.1: +chokidar@3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -5385,7 +5034,7 @@ chokidar@^3.5.1: optionalDependencies: fsevents "~2.3.2" -chownr@^1.0.1, chownr@^1.1.1, 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== @@ -5400,15 +5049,27 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +chromium-bidi@0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.7.tgz#4c022c2b0fb1d1c9b571fadf373042160e71d236" + integrity sha512-6+mJuFXwTMU6I3vYLs6IL8A1DyQTPjCfIL971X0aMPVGRbGnNfl6i6Cl0NMbxi2bRYLGESt9T2ZIMRM5PAEcIQ== + dependencies: + mitt "3.0.0" + +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== +ci-info@^3.2.0, ci-info@^3.6.1: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== class-utils@^0.3.5: version "0.3.6" @@ -5421,15 +5082,22 @@ class-utils@^0.3.5: static-extend "^0.1.1" 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.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== 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== +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: + escape-string-regexp "5.0.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" @@ -5437,11 +5105,16 @@ cli-cursor@3.1.0, cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@2.6.1, 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.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + 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" @@ -5505,7 +5178,7 @@ clone-buffer@^1.0.0: resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" 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== @@ -5514,13 +5187,6 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clone-response@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q== - dependencies: - mimic-response "^1.0.0" - clone-response@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" @@ -5557,12 +5223,10 @@ clsx@^1.1.0: resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== -cmd-shim@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724" - integrity sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw== - dependencies: - mkdirp-infer-owner "^2.0.0" +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" @@ -5612,11 +5276,16 @@ colorette@^1.2.1, colorette@^1.4.0: integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== colorette@^2.0.16: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== -columnify@^1.6.0: +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== @@ -5624,7 +5293,7 @@ columnify@^1.6.0: 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== @@ -5632,15 +5301,32 @@ 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.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A== + dependencies: + graceful-readlink ">= 1.0.0" 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" @@ -5651,11 +5337,6 @@ commander@^8.2.0, commander@^8.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -common-ancestor-path@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" - integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -5669,19 +5350,16 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" +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== + component-emitter@^1.2.1, 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== -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" - compression-webpack-plugin@^9.0.0: version "9.2.0" resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-9.2.0.tgz#57fd539d17c5907eebdeb4e83dcfe2d7eceb9ef6" @@ -5700,7 +5378,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -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== @@ -5727,10 +5405,10 @@ concat-with-sourcemaps@*: dependencies: source-map "^0.6.1" -conf@^10.1.2: - 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" @@ -5743,14 +5421,6 @@ conf@^10.1.2: pkg-up "^3.1.0" semver "^7.3.5" -config-chain@^1.1.11, config-chain@^1.1.12: - 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== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - 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" @@ -5765,106 +5435,95 @@ 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.12: - 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@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" + integrity sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg== dependencies: compare-func "^2.0.0" - q "^1.5.1" -conventional-changelog-core@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" - integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== +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 "^5.0.0" - conventional-commits-parser "^3.2.0" - dateformat "^3.0.0" - get-pkg-repo "^4.0.0" - git-raw-commits "^2.0.8" + 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 "^4.1.1" - lodash "^4.17.15" - normalize-package-data "^3.0.0" - 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 "^4.0.0" -conventional-changelog-preset-loader@^2.3.4: - 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@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz#e0757072f045fe03d91da6343c843029e702f359" - integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== +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: - conventional-commits-filter "^2.0.7" - dateformat "^3.0.0" + 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.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.2.0: - 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@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" - integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== +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.3.4" - conventional-commits-filter "^2.0.7" - conventional-commits-parser "^3.2.0" - git-raw-commits "^2.0.8" - git-semver-tags "^4.1.1" - meow "^8.0.0" - q "^1.5.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, 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" + 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== cookie-signature@1.0.6: version "1.0.6" @@ -5881,10 +5540,10 @@ cookie@^0.4.0, cookie@~0.4.1: 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== +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" @@ -5911,13 +5570,12 @@ 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.23.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.5.tgz#11edce2f1c4f69a96d30ce77c805ce118909cd5b" - integrity sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg== +core-js-compat@^3.31.0: + version "3.31.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.1.tgz#5084ad1a46858df50ff89ace152441a63ba7aae0" + integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== dependencies: - browserslist "^4.21.2" - semver "7.0.0" + browserslist "^4.21.9" core-util-is@1.0.2: version "1.0.2" @@ -5937,10 +5595,20 @@ cors@~2.8.5: object-assign "^4" vary "^1" +cosmiconfig@8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" + integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + cosmiconfig@^7.0.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== + 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.2.1" @@ -5948,41 +5616,45 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: 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@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== 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" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" -cp-file@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd" - integrity sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw== +cp-file@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-10.0.0.tgz#bbae9ecb9f505951b862880d2901e1f56de7a4dc" + integrity sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg== dependencies: - graceful-fs "^4.1.2" - make-dir "^3.0.0" - nested-error-stacks "^2.0.0" - p-event "^4.1.0" + graceful-fs "^4.2.10" + nested-error-stacks "^2.1.1" + p-event "^5.0.1" -cpy@^8.1.2: - version "8.1.2" - resolved "https://registry.yarnpkg.com/cpy/-/cpy-8.1.2.tgz#e339ea54797ad23f8e3919a5cffd37bfc3f25935" - integrity sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg== +cpy@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/cpy/-/cpy-10.1.0.tgz#85517387036b9be480f6424e54089261fc6f4bab" + integrity sha512-VC2Gs20JcTyeQob6UViBLnyP0bYHkBh6EiKzot9vi2DmeGlFT9Wd7VG3NBrkNx/jYvFBeyDOMMHdHQhbtKLgHQ== dependencies: - arrify "^2.0.1" - cp-file "^7.0.0" - globby "^9.2.0" - has-glob "^1.0.0" - junk "^3.1.0" - nested-error-stacks "^2.1.0" - p-all "^2.1.0" - p-filter "^2.1.0" - p-map "^3.0.0" + arrify "^3.0.0" + cp-file "^10.0.0" + globby "^13.1.4" + junk "^4.0.1" + micromatch "^4.0.5" + nested-error-stacks "^2.1.1" + p-filter "^3.0.0" + p-map "^6.0.0" + +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: + buffer "^5.1.0" create-frame@^1.0.0: version "1.0.0" @@ -5994,27 +5666,26 @@ create-frame@^1.0.0: isobject "^3.0.0" lazy-cache "^2.0.2" -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-fetch@^3.1.5: +cross-fetch@3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" -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 sha512-snteb3aVrxYYOX9e8BabYFK9WhCDhTlw1YQktfTthBogxri4/2r9U2nQc0ffY73ZAxezDc+U8gvHAeU1wy1ubQ== +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== dependencies: - lru-cache "^4.0.0" - which "^1.2.8" + node-fetch "^2.6.12" cross-spawn@^4.0.0: version "4.0.2" @@ -6035,7 +5706,7 @@ cross-spawn@^6.0.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: +cross-spawn@^7.0.0, 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== @@ -6050,66 +5721,54 @@ crypto-js@^4.1.1: integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== 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.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.7" + postcss "^8.4.21" postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" + postcss-modules-local-by-default "^4.0.3" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" - semver "^7.3.5" + semver "^7.3.8" 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" + 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.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== 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== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - -data-uri-to-buffer@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +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== -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-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: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^12.0.0" date.js@^0.3.1: version "0.3.3" @@ -6118,11 +5777,16 @@ date.js@^0.3.1: dependencies: debug "~3.1.0" -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" @@ -6130,7 +5794,7 @@ 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, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -6144,7 +5808,7 @@ debug@3.2.6: 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: +debug@4, debug@4.3.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.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== @@ -6165,15 +5829,10 @@ debug@~3.1.0: dependencies: ms "2.0.0" -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== - decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + 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" @@ -6183,6 +5842,16 @@ decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 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.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + decode-named-character-reference@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" @@ -6190,17 +5859,10 @@ decode-named-character-reference@^1.0.0: 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 sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" +decode-uri-component@^0.2.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" @@ -6269,15 +5931,15 @@ 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 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.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" @@ -6286,20 +5948,15 @@ deep-extend@^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== +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-compare@^1.0.0: version "1.0.0" @@ -6314,18 +5971,13 @@ default-shell@^1.0.0: 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 sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA== + 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== @@ -6335,10 +5987,10 @@ define-lazy-prop@^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.2, define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -6375,16 +6027,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@2.0.0: +depd@2.0.0, 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 sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -6405,11 +6052,6 @@ detect-indent@^5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -6425,7 +6067,12 @@ detect-node@^2.0.4: 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.1107588: + version "0.0.1107588" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz#f8cac707840b97cc30b029359341bcbbb0ad8ffa" + integrity sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg== + +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== @@ -6433,17 +6080,37 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + 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: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + diff@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== -dir-glob@^2.0.0, dir-glob@^2.2.2: +dir-compare@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" + integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA== + dependencies: + buffer-equal "1.0.0" + colors "1.0.3" + commander "2.9.0" + minimatch "3.0.4" + +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== @@ -6457,10 +6124,38 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dmg-builder@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-23.6.0.tgz#d39d3871bce996f16c07d2cafe922d6ecbb2a948" + integrity sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA== + dependencies: + app-builder-lib "23.6.0" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + fs-extra "^10.0.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.4.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" - integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + version "5.6.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" + integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -6493,17 +6188,17 @@ dom-helpers@^5.0.1: "@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.10" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.10.tgz#901f7390ffe16a91a5a556b94043314cd4850385" - integrity sha512-o7Fg/AgC7p/XpKjf/+RC3Ok6k4St5F7Q6q6+Nnm3p2zGWioAY6dh0CbbuwOhH2UcSzKsdniE/YnE2/92JcsA+g== + version "2.4.7" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" + integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== dot-case@^3.0.4: version "3.0.4" @@ -6527,30 +6222,22 @@ dot-prop@^6.0.1: dependencies: is-obj "^2.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@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + dotenv@~10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -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" - -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== @@ -6567,36 +6254,79 @@ duplexer2@~0.1.4: dependencies: readable-stream "^2.0.2" -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - 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== -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - 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 sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== ejs@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" - integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" +electron-builder@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-23.6.0.tgz#c79050cbdce90ed96c5feb67c34e9e0a21b5331b" + integrity sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw== + dependencies: + "@types/yargs" "^17.0.1" + app-builder-lib "23.6.0" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + chalk "^4.1.1" + dmg-builder "23.6.0" + fs-extra "^10.0.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.2.0" + simple-update-notifier "^1.0.7" + yargs "^17.5.1" + +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-osx-sign@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz#9b69c191d471d9458ef5b1e4fdd52baa059f1bb8" + integrity sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg== + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-publish@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-23.6.0.tgz#ac9b469e0b07752eb89357dd660e5fb10b3d1ce9" + integrity sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + chalk "^4.1.1" + fs-extra "^10.0.0" + lazy-val "^1.0.5" + mime "^2.5.2" + electron-rebuild@^3.2.7: version "3.2.9" resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-3.2.9.tgz#ea372be15f591f8d6d978ee9bca6526dadbcf20f" @@ -6618,17 +6348,17 @@ electron-rebuild@^3.2.7: yargs "^17.0.1" electron-store@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.0.2.tgz#95c8cf81c1e1cf48b24f3ceeea24b921c1ff62d7" - integrity sha512-9GwUMv51w8ydbkaG7X0HrPlElXLApg63zYy1/VZ/a08ndl0gfm4iCoD3f0E1JvP3V16a+7KxqriCI0c122stiA== + version "8.1.0" + resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.1.0.tgz#46a398f2bd9aa83c4a9daaae28380e2b3b9c7597" + integrity sha512-2clHg/juMjOH0GT9cQ6qtmIvK183B39ZXR0bUoPwKwYHJsEF3quqyDzMFUAu+0OP8ijmN2CbPRAelhNbWUbzwA== dependencies: - conf "^10.1.2" - type-fest "^2.12.2" + conf "^10.2.0" + type-fest "^2.17.0" -electron-to-chromium@^1.4.188: - version "1.4.198" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.198.tgz#36a8e7871046f7f94c01dc0133912fd5cf226c6a" - integrity sha512-jwqQPdKGeAslcq8L+1SZZgL6uDiIDmTe9Gq4brsdWAH27y7MJ2g9Ue6MyST3ogmSM49EAQP7bype1V5hsuNrmQ== +electron-to-chromium@^1.4.431: + version "1.4.462" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.462.tgz#4faf5072bb5f55269d35ca9dc7475e7bf91b1ac3" + integrity sha512-ux2LqN9JKRBDKXMT+78jtiBLPiXf+rLtYlsrOg5Qn7uv6Cbg7+9JyIalE3wcqkOdB2wPCUYNWAuL7suKRMHe9w== electron-updater@^4.6.5: version "4.6.5" @@ -6644,14 +6374,14 @@ electron-updater@^4.6.5: lodash.isequal "^4.5.0" semver "^7.3.5" -electron@^15.3.5: - version "15.5.7" - resolved "https://registry.yarnpkg.com/electron/-/electron-15.5.7.tgz#aadb0081c504f2c2d8f81ea5fd23e38881afe86a" - integrity sha512-n4mVlxoMc4eYx07wWFWGficL+iOMz5xZEf5dBtE/wwLm0fQpYVyW4AlknMFG9F8Css0MM0JSwNMOyRg5e1vDtg== +electron@^23.2.4: + version "23.3.10" + resolved "https://registry.yarnpkg.com/electron/-/electron-23.3.10.tgz#f148e0ddeb84c57979530842011ac228851e354b" + integrity sha512-PcEQo8letcJYUAP3x+GN4Qf4atS65EVxe3VhKrQUnSI6GA5+K1zrs3ur88iHXD4a3mJaH/491Y4pBTLxFqwXnA== dependencies: - "@electron/get" "^1.13.0" - "@types/node" "^14.6.2" - extract-zip "^1.0.3" + "@electron/get" "^2.0.0" + "@types/node" "^16.11.26" + extract-zip "^2.0.1" emoji-regex@^7.0.1: version "7.0.3" @@ -6663,12 +6393,17 @@ emoji-regex@^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 sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== @@ -6687,26 +6422,26 @@ 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.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.2.3.tgz#a8cbdab003162529db85e9de31575097f6d29458" - integrity sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw== +engine.io-client@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.1.tgz#1735fb8ae3bae5ae13115e18d2f484daf005dd9c" + integrity sha512-hE5wKXH8Ru4L19MbM1GgYV/2Qo54JSMh1rlJbfpa40bEWkCKNo3ol2eOtGmowcr+ysgbI7+SGL+by42Q3pt/Ng== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" - engine.io-parser "~5.0.3" - ws "~8.2.3" + engine.io-parser "~5.1.0" + ws "~8.11.0" xmlhttprequest-ssl "~2.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.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.1.0.tgz#d593d6372d7f79212df48f807b8cace1ea1cb1b8" + integrity sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w== -engine.io@~6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" - integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== +engine.io@~6.5.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.1.tgz#59725f8593ccc891abb47f1efcdc52a089525a56" + integrity sha512-mGqhI+D7YxS9KJMppR6Iuo37Ed3abhU8NdfgSvJSDUafQutrN+sPTncJYTyM9+tkhSmWodKtVYGPPHyXJEwEQA== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -6716,18 +6451,18 @@ engine.io@~6.2.0: cookie "~0.4.1" cors "~2.8.5" debug "~4.3.1" - engine.io-parser "~5.0.3" - ws "~8.2.3" + engine.io-parser "~5.1.0" + ws "~8.11.0" -enhanced-resolve@^5.9.3: - version "5.10.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" - integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.5, enquirer@^2.3.6, enquirer@~2.3.6: +enquirer@^2.3.6, 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== @@ -6739,6 +6474,11 @@ ent@^2.2.0: resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== +entities@^4.4.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" resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" @@ -6749,11 +6489,16 @@ 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.7.3, envinfo@^7.7.4: +envinfo@7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +envinfo@^7.7.3: + version "7.10.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" + integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" @@ -6778,44 +6523,69 @@ error-symbol@^0.1.0: resolved "https://registry.yarnpkg.com/error-symbol/-/error-symbol-0.1.0.tgz#0a4dae37d600d15a29ba453d8ef920f1844333f6" integrity sha512-VyjaKxUmeDX/m2lxm/aknsJ1GWDWUO2Ze2Ad8S1Pb9dykAm9TjSKp5CjrNyltYqZ5W/PO6TInAmO2/BfwMyT1g== -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: - 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== +es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.0" + object-inspect "^1.12.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" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== -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-module-lexer@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" + integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" es-shim-unscopables@^1.0.0: version "1.0.0" @@ -6858,64 +6628,69 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -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== + +escodegen@^2.0.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.8.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== -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: +eslint-plugin-react-hooks@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== -eslint-plugin-react@^7.24.0: - version "7.30.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz#2be4ab23ce09b5949c6631413ba64b2810fd3e22" - integrity sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg== +eslint-plugin-react@^7.32.2: + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== dependencies: - array-includes "^3.1.5" - array.prototype.flatmap "^1.3.0" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" estraverse "^5.3.0" 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.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" prop-types "^15.8.1" - resolve "^2.0.0-next.3" + resolve "^2.0.0-next.4" semver "^6.3.0" - string.prototype.matchall "^4.0.7" + string.prototype.matchall "^4.0.8" -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" @@ -6932,84 +6707,70 @@ 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.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.1.tgz#936821d3462675f25a18ac5fd88a67cc15b393bd" + integrity sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA== 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" +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint@^8.39.0: + version "8.45.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" + integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.1.0" + "@eslint/js" "8.44.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" 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.0" + eslint-visitor-keys "^3.4.1" + espree "^9.6.0" + 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: + 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" @@ -7021,10 +6782,10 @@ esprima@~3.1.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg== -esquery@^1.0.1, 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.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -7035,7 +6796,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== @@ -7078,16 +6839,20 @@ events@^3.2.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 sha512-zmBGzLd3nhA/NB9P7VLoceAO6vyYPftvl809Vjwe5U2fYI9tYWbeKqP3wZlAw9WS+znnkogf/bhSU+Gcn2NbkQ== +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" @@ -7115,6 +6880,36 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +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 "^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" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -7130,6 +6925,21 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== + dependencies: + 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-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -7148,14 +6958,19 @@ expand-template@^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== +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + 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== + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.0" + body-parser "1.20.1" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.5.0" @@ -7174,7 +6989,7 @@ express@^4.16.3: parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.10.3" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.18.0" @@ -7215,7 +7030,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: 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== @@ -7243,20 +7058,16 @@ extglob@^2.0.4: 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, 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 sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + optionalDependencies: + "@types/yauzl" "^2.9.1" extsprintf@^1.2.0: version "1.4.1" @@ -7276,9 +7087,14 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 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-fifo@^1.1.0, fast-fifo@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.0.tgz#03e381bcbfb29932d7c3afde6e15e83e05ab4d8b" + integrity sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw== fast-glob@3.2.7: version "3.2.7" @@ -7291,22 +7107,10 @@ fast-glob@3.2.7: merge2 "^1.3.0" micromatch "^4.0.4" -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-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== +fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -7319,30 +7123,30 @@ fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^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 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 sha512-2HxzrqJhmMoxVzARjYFvkzkL2dCBB8sogU5sD8gqcZWv5UCivK9/cXM9KIPDRwU+eD3mbRDN/GhW8bO/4dtMfg== + 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== fastest-levenshtein@^1.0.12: - version "1.0.14" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz#9054384e4b7a78c88d01a4432dc18871af0ac859" - integrity sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA== + 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.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" @@ -7353,6 +7157,14 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +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@3.2.0, figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -7372,16 +7184,20 @@ 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.5.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-18.5.0.tgz#604a001ba0d32577d4c3fa420ee104d656b914d2" + integrity sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ== + 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 sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA== -file-type@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" - integrity sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ== - file-type@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" @@ -7392,22 +7208,12 @@ file-type@^6.1.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== -file-uri-to-path@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba" - integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg== - -filelist@^1.0.1: +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== @@ -7419,14 +7225,10 @@ filename-reserved-regex@^2.0.0: resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" 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" @@ -7437,6 +7239,15 @@ filenamify@^4.1.0: strip-outer "^1.0.1" trim-repeated "^1.0.0" +filenamify@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-5.1.1.tgz#a1ccc5ae678a5e34f578afcb9b72898264d166d2" + integrity sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA== + dependencies: + filename-reserved-regex "^3.0.0" + strip-outer "^2.0.0" + trim-repeated "^2.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" @@ -7493,6 +7304,14 @@ find-up@3.0.0, find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@5.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-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" @@ -7536,16 +7355,11 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" - integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== - -follow-redirects@^1.14.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -follow-redirects@^1.15.0: +follow-redirects@^1.14.0, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -7555,6 +7369,13 @@ font-awesome@^4.7.0: resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" 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== + dependencies: + is-callable "^1.1.3" + 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" @@ -7567,19 +7388,18 @@ for-own@^1.0.0: dependencies: for-in "^1.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 sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -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== +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +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" @@ -7599,19 +7419,22 @@ form-data@^4.0.0: combined-stream "^1.0.8" 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" @@ -7630,14 +7453,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -from2@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - from@~0: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" @@ -7662,6 +7477,15 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.0, fs-extra@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + 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" @@ -7680,7 +7504,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.1.0: +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== @@ -7690,20 +7514,20 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.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== - dependencies: - minipass "^2.6.0" - -fs-minipass@^2.0.0, fs-minipass@^2.1.0: +fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" +fs-minipass@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" + integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== + dependencies: + minipass "^5.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -7729,14 +7553,6 @@ fstream@^1.0.12: mkdirp ">=0.5 0" rimraf "2" -ftp@^0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" - integrity sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ== - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -7752,12 +7568,7 @@ function.prototype.name@^1.1.5: 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 sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.2: +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== @@ -7830,13 +7641,14 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.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== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-object@^0.2.0: @@ -7852,7 +7664,7 @@ get-own-enumerable-property-symbols@^3.0.0: 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@^4.0.0: +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== @@ -7862,22 +7674,15 @@ get-pkg-repo@^4.0.0: through2 "^2.0.0" yargs "^16.2.0" -get-port@^5.1.1: +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== - dependencies: - npm-conf "^1.1.0" - -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 sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== +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" @@ -7887,21 +7692,21 @@ get-stream@^2.2.0: object-assign "^4.0.1" pinkie-promise "^2.0.0" -get-stream@^4.0.0, get-stream@^4.1.0: +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" -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== @@ -7914,40 +7719,19 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-uri@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c" - integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg== - dependencies: - "@tootallnate/once" "1" - data-uri-to-buffer "3" - debug "4" - file-uri-to-path "2" - fs-extra "^8.1.0" - ftp "^0.3.10" - 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 sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - -git-raw-commits@^2.0.8: - version "2.0.11" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" - integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== +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 "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" + meow "^8.1.2" + split2 "^3.2.2" git-remote-origin-url@^2.0.0: version "2.0.0" @@ -7957,13 +7741,13 @@ git-remote-origin-url@^2.0.0: gitconfiglocal "^1.0.0" pify "^2.3.0" -git-semver-tags@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780" - integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== +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 "^8.0.0" - semver "^6.0.0" + meow "^8.1.2" + semver "^7.0.0" git-up@^7.0.0: version "7.0.0" @@ -7973,7 +7757,7 @@ git-up@^7.0.0: is-ssh "^1.4.0" parse-url "^8.1.0" -git-url-parse@^13.1.0: +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== @@ -7992,25 +7776,19 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== - dependencies: - is-glob "^3.1.0" - path-dirname "^1.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.2, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0, 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 sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig== +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" @@ -8041,7 +7819,30 @@ glob@7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + 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@^10.2.2, glob@^10.3.3: + version "10.3.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.3.tgz#8360a4ffdd6ed90df84aa8d52f21f452e86a123b" + integrity sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.0.0, 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== @@ -8054,9 +7855,9 @@ glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: path-is-absolute "^1.0.0" glob@^8.0.1, glob@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + 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" @@ -8064,6 +7865,16 @@ glob@^8.0.1, glob@^8.0.3: 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" @@ -8076,36 +7887,26 @@ 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.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" -globalthis@^1.0.1: +globalthis@^1.0.1, globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" -globby@^11.0.2, 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== @@ -8117,6 +7918,17 @@ globby@^11.0.2, globby@^11.0.3: merge2 "^1.4.1" slash "^3.0.0" +globby@^13.1.4: + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.3.0" + ignore "^5.2.4" + merge2 "^1.4.1" + slash "^4.0.0" + globby@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" @@ -8125,23 +7937,9 @@ globby@^7.1.1: array-union "^1.0.1" dir-glob "^2.0.0" glob "^7.1.2" - ignore "^3.3.5" - 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" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" google-protobuf@3.12.4: version "3.12.4" @@ -8149,28 +7947,18 @@ google-protobuf@3.12.4: integrity sha512-ItTn8YepDQMHEMHloUPH+FDaTPiHTnbsMvP50aXfbI65IK3AA5+wXlHSygJH8xz+h1g4gu7V+CK5X1/SaGITsA== 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.2" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.2.tgz#4580a2bea8bbb291ee579d1fefb14d6fa3070ea4" + integrity sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA== -got@^11.7.0, got@^11.8.5: - version "11.8.5" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" - integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" + get-intrinsic "^1.1.3" -got@^11.8.0: +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== @@ -8187,50 +7975,37 @@ got@^11.8.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== +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: + "@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.10, graceful-fs@^4.2.11, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + 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== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== growl@1.10.5: version "1.10.5" @@ -8238,9 +8013,9 @@ growl@1.10.5: 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== + version "1.12.4" + resolved "https://registry.yarnpkg.com/grpc-tools/-/grpc-tools-1.12.4.tgz#a044c9e8157941033ea7a5f144c2dc9dc4501de4" + integrity sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg== dependencies: "@mapbox/node-pre-gyp" "^1.0.5" @@ -8335,19 +8110,6 @@ handlebars@^4.0.11, handlebars@^4.7.7: 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 sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -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== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" @@ -8368,13 +8130,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-glob/-/has-glob-1.0.0.tgz#9aaa9eedbffb1ba3990a7b0010fb678ee0081207" - integrity sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g== - dependencies: - is-glob "^3.0.0" - 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" @@ -8382,23 +8137,16 @@ has-property-descriptors@^1.0.0: 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-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.0, 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== -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== - dependencies: - has-symbol-support-x "^1.4.1" - has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -8406,7 +8154,7 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -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 sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== @@ -8458,9 +8206,9 @@ hash.js@^1.1.7: minimalistic-assert "^1.0.1" 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: version "1.2.0" @@ -8503,6 +8251,11 @@ helper-md@^0.2.2: fs-exists-sync "^0.1.0" remarkable "^1.6.2" +hexoid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== + highlight.js@^9.12.0: version "9.18.5" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" @@ -8527,26 +8280,26 @@ hosted-git-info@^3.0.6: dependencies: lru-cache "^6.0.0" -hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: +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" -hosted-git-info@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-5.2.1.tgz#0ba1c97178ef91f3ab30842ae63d6a272341156f" - integrity sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw== +hosted-git-info@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== dependencies: lru-cache "^7.5.1" -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== +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: - whatwg-encoding "^1.0.1" + whatwg-encoding "^2.0.0" html-tag@^2.0.0: version "2.0.0" @@ -8556,15 +8309,10 @@ html-tag@^2.0.0: is-self-closing "^1.0.1" kind-of "^6.0.0" -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.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" @@ -8595,15 +8343,6 @@ 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 sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http-status-codes@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-1.4.0.tgz#6e4c15d16ff3a9e2df03b89f3a55e1aae05fb477" @@ -8617,15 +8356,15 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.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.0" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" + integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== 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.1, 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== @@ -8633,11 +8372,21 @@ https-proxy-agent@^5.0.0: agent-base "6" 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" @@ -8650,6 +8399,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" @@ -8657,7 +8414,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== @@ -8675,9 +8432,9 @@ idb@^4.0.5: 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== + version "2.2.3" + resolved "https://registry.yarnpkg.com/idtoken-verifier/-/idtoken-verifier-2.2.3.tgz#1758e9b0596f7036134938d63e107a72045622b8" + integrity sha512-hhpzB+MRgEvbwqzRLFdVbG55lKdXQVfeYEjAA2qu0UC72MSLeR0nX7P7rY5Dycz1aISHPOwq80hIPFoJ/+SItA== dependencies: base64-js "^1.5.1" crypto-js "^4.1.1" @@ -8708,32 +8465,29 @@ ignore-walk@^5.0.1: dependencies: minimatch "^5.0.1" +ignore-walk@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.3.tgz#0fcdb6decaccda35e308a7b0948645dd9523b7bb" + integrity sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA== + dependencies: + 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.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" - integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== - -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, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: +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== @@ -8741,7 +8495,7 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^3.0.2: +import-local@3.1.0, import-local@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== @@ -8759,10 +8513,10 @@ indent-string@^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.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== +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== inflight@^1.0.4: version "1.0.6" @@ -8777,28 +8531,28 @@ info-symbol@^0.1.0: resolved "https://registry.yarnpkg.com/info-symbol/-/info-symbol-0.1.0.tgz#27841d72867ddb4242cd612d79c10633881c6a78" integrity sha512-qkc9wjLDQ+dYYZnY5uJXGNNHyZ0UOMDUnhvy0SEZGVVYmQ5s4i8cPAin2MbU6OxJgi8dfj/AnwqPx0CJE6+Lsw== -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@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-3.0.2.tgz#f5bc9bac93f2bdc005778bc2271be642fecfcd69" - integrity sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A== +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 "^9.0.1" - promzard "^0.3.0" - read "^1.0.7" - read-package-json "^5.0.0" + 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 "^4.0.0" + validate-npm-package-name "^5.0.0" inline-style-parser@0.1.1: version "0.1.1" @@ -8826,12 +8580,19 @@ inquirer@^8.2.4: through "^2.3.6" wrap-ansi "^7.0.0" -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" + kind-of "^6.0.2" + +internal-slot@^1.0.3, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -8845,18 +8606,10 @@ interpret@^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 sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ== - 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.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/inversify/-/inversify-6.0.1.tgz#b20d35425d5d8c5cd156120237aad0008d969f02" + integrity sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ== invert-kv@^2.0.0: version "2.0.0" @@ -8892,6 +8645,23 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -8929,10 +8699,17 @@ is-buffer@^2.0.0, is-buffer@~2.0.3: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -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.1.3, is-callable@^1.1.4, 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" @@ -8941,17 +8718,10 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.5.0, is-core-module@^2.9.0: - 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-core-module@^2.8.1: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== dependencies: has "^1.0.3" @@ -9000,9 +8770,9 @@ 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== + 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-even@^1.0.0: version "1.0.0" @@ -9023,7 +8793,7 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -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 sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== @@ -9045,14 +8815,14 @@ is-fullwidth-code-point@^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@^3.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 sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: - is-extglob "^2.1.0" + has-tostringtag "^1.0.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== @@ -9127,11 +8897,6 @@ is-obj@^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" @@ -9139,17 +8904,17 @@ is-odd@^0.1.2: dependencies: is-number "^3.0.0" -is-online@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/is-online/-/is-online-9.0.1.tgz#71a34202fa826bae6f3ff8bea420c56573448a5f" - integrity sha512-+08dRW0dcFOtleR2N3rHRVxDyZtQitUp9cC+KpKTds0mXibbQyW5js7xX0UGyQXkaLUJObe0w6uQ4ex34lX9LA== +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: - got "^11.8.0" - p-any "^3.0.0" - p-timeout "^3.2.0" - public-ip "^4.0.4" + 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== @@ -9159,7 +8924,7 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-obj@^2.0.0: +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== @@ -9181,6 +8946,11 @@ 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-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-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" @@ -9199,11 +8969,6 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" 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-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" @@ -9225,6 +8990,11 @@ is-ssh@^1.4.0: dependencies: protocols "^2.0.1" +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" @@ -9235,6 +9005,11 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +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.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -9256,10 +9031,16 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typedarray@^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 sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" is-unicode-supported@^0.1.0: version "0.1.0" @@ -9290,16 +9071,28 @@ is-wsl@^2.2.0: 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 sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - 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 sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +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== + +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isbinaryfile@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -9322,28 +9115,39 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 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 sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -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== +jackspeak@^2.0.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" + integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" jake@^10.8.5: - version "10.8.5" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" - integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== dependencies: async "^3.2.3" chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" + filelist "^1.0.4" + minimatch "^3.1.2" + +"jest-diff@>=29.4.3 < 30": + version "29.6.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.1.tgz#13df6db0a89ee6ad93c747c75c85c70ba941e545" + integrity sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.6.1" + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== jest-worker@^27.4.5: version "27.5.1" @@ -9392,47 +9196,42 @@ jsbn@^1.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - 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" +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@^2.5.1: version "2.5.2" @@ -9444,12 +9243,7 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -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== @@ -9464,6 +9258,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.0" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz#2cb2ee33069a78870a0c7e3da560026b89669cf7" + integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== + 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" @@ -9479,39 +9278,29 @@ 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 sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-nice@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" - integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== - -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 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: + 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: +jsonc-parser@3.2.0, jsonc-parser@^3.0.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== @@ -9521,11 +9310,6 @@ jsonc-parser@^2.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.3.1.tgz#59549150b133f2efacca48fe9ce1ec0659af2342" integrity sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg== -jsonc-parser@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.1.0.tgz#73b8f0e5c940b83d03476bc2e51a20ef0932615d" - integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg== - jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -9547,52 +9331,36 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -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" - "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.2" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz#afe5efe4332cd3515c065072bd4d6b0aa22152bd" - integrity sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q== + version "3.3.4" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz#b896535fed5b867650acce5a9bd4135ffc7b3bf9" + integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== dependencies: - array-includes "^3.1.5" - 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" -junk@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" - integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== +junk@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/junk/-/junk-4.0.1.tgz#7ee31f876388c05177fe36529ee714b07b50fbed" + integrity sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ== -just-diff-apply@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.4.1.tgz#1debed059ad009863b4db0e8d8f333d743cdd83b" - integrity sha512-AAV5Jw7tsniWwih8Ly3fXxEZ06y+6p5TwQMsw0dzZ/wPKilzyDgdAnL0Ug4NNIquPUOh1vfFWEHbmXUqM5+o8g== +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-diff@^5.0.1, just-diff@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.1.1.tgz#8da6414342a5ed6d02ccd64f5586cbbed3146202" - integrity sha512-u8HXJ3HlNrTzY7zrYYKjNEfBlyjqhdBkoyTVdjtn7p02RJD5NvR8rIClzeGA7t+UYP1/7eAkWNLU0+P3QrEqKQ== +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" @@ -9601,26 +9369,11 @@ 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== - dependencies: - json-buffer "3.0.0" - -keyv@^4.0.0: - version "4.3.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.3.3.tgz#6c1bcda6353a9e96fc1b4e1aeb803a6e35090ba9" - integrity sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ== +keyv@^4.0.0, keyv@^4.5.2: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== 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: @@ -9659,7 +9412,7 @@ lazy-cache@^2.0.1, lazy-cache@^2.0.2: dependencies: set-getter "^0.1.0" -lazy-val@^1.0.5: +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== @@ -9671,39 +9424,86 @@ lcid@^2.0.0: 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@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-6.1.0.tgz#693145393ec22fd3ca98d817deab2246c1e2b107" - integrity sha512-3qAjIj8dgBwHtCAiLbq4VU/C1V9D1tvTLm2owZubdGAN72aB5TxuCu2mcw+yeEorOcXuR9YWx7EXIkAf+G0N2w== - dependencies: - "@lerna/add" "6.1.0" - "@lerna/bootstrap" "6.1.0" - "@lerna/changed" "6.1.0" - "@lerna/clean" "6.1.0" - "@lerna/cli" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/create" "6.1.0" - "@lerna/diff" "6.1.0" - "@lerna/exec" "6.1.0" - "@lerna/import" "6.1.0" - "@lerna/info" "6.1.0" - "@lerna/init" "6.1.0" - "@lerna/link" "6.1.0" - "@lerna/list" "6.1.0" - "@lerna/publish" "6.1.0" - "@lerna/run" "6.1.0" - "@lerna/version" "6.1.0" - "@nrwl/devkit" ">=14.8.6 < 16" - import-local "^3.0.2" +lerna@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.1.4.tgz#0778732f4c77ead71a20ba1e9b0a77edc75cb383" + integrity sha512-/cabvmTTkmayyALIZx7OpHRex72i8xSOkiJchEkrKxAZHoLNaGSwqwKkj+x6WtmchhWl/gLlqwQXGRuxrJKiBw== + dependencies: + "@lerna/child-process" "7.1.4" + "@lerna/create" "7.1.4" + "@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 "6.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 "3.1.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 ">=14.8.6 < 16" - typescript "^3 || ^4" + 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" @@ -9729,34 +9529,34 @@ 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 sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -libnpmaccess@^6.0.3: - version "6.0.4" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-6.0.4.tgz#2dd158bd8a071817e2207d3b201d37cf1ad6ae6b" - integrity sha512-qZ3wcfIyUoW0+qSFkMBovcTrSGJ3ZeyvpR7d5N9pEYv/kXs8sHP2wiqEIXBKLFrZlmM0kR0RJD7mtfLngtlLag== - dependencies: - aproba "^2.0.0" - minipass "^3.1.1" - npm-package-arg "^9.0.1" - npm-registry-fetch "^13.0.0" +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" -libnpmpublish@^6.0.4: - version "6.0.5" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-6.0.5.tgz#5a894f3de2e267d62f86be2a508e362599b5a4b1" - integrity sha512-LUR08JKSviZiqrYTDfywvtnsnxr+tOvBU0BF8H+9frt7HMvc6Qn6F8Ubm72g5hDTHbq8qupKfDvDAln2TVPvFg== +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: - normalize-package-data "^4.0.0" - npm-package-arg "^9.0.1" - npm-registry-fetch "^13.0.0" - semver "^7.3.7" - ssri "^9.0.0" + just-performance "4.3.0" line-height@^0.3.1: version "0.3.1" @@ -9770,6 +9570,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.3" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" + integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== + linkify-it@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" @@ -9777,6 +9582,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" @@ -9802,7 +9628,7 @@ listenercount@~1.0.1: resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" 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== @@ -9816,6 +9642,16 @@ listr2@^3.12.2: through "^2.3.8" wrap-ansi "^7.0.0" +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.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" @@ -9826,34 +9662,24 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -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.15" - parse-json "^5.0.0" - strip-bom "^4.0.0" - type-fest "^0.6.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== + 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" @@ -9882,6 +9708,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +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._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -9922,11 +9755,6 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - lodash.template@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -9947,12 +9775,7 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: +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== @@ -9972,7 +9795,7 @@ log-symbols@3.0.0: dependencies: chalk "^2.4.2" -log-symbols@^4.1.0: +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== @@ -10017,9 +9840,9 @@ long@^4.0.0: integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== long@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.0.tgz#2696dadf4b4da2ce3f6f6b89186085d94d52fd61" - integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -10029,9 +9852,9 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: js-tokens "^3.0.0 || ^4.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== + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: get-func-name "^2.0.0" @@ -10042,22 +9865,17 @@ 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 sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A== - -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@^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== @@ -10065,6 +9883,13 @@ lru-cache@^4.0.0, lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -10072,15 +9897,15 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.4.4, lru-cache@^7.5.1: - version "7.14.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" - integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== +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== -lru-cache@^7.7.1: - version "7.13.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.13.1.tgz#267a81fbd0881327c46a81c5922606a2cfe336c4" - integrity sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ== +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" + integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== lzma-native@^8.0.5: version "8.0.6" @@ -10096,14 +9921,21 @@ macaddress@^0.2.9: resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.9.tgz#3579b8b9acd5b96b4553abf0f394185a86813cb3" integrity sha512-k4F1JUof6cQXxNFzx3thLby4oJzXTXQueAOOts944Vqizn+Rjc2QNFenT9FJSLU1CH3PmrHRSyZs2E+Cqw+P2w== -make-dir@^1.0.0, make-dir@^1.2.0: +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== + dependencies: + semver "^6.0.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== @@ -10111,56 +9943,33 @@ 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: - 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== - dependencies: - semver "^6.0.0" - -make-fetch-happen@^10.0.3: - version "10.2.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.0.tgz#0bde3914f2f82750b5d48c6d2294d2c74f985e5b" - integrity sha512-OnEfCLofQVJ5zgKwGk55GaqosqKjaR6khQlJY3dBAA+hM25Bc5CmX5rKUfVut+rYA3uidA7zb7AvcglU87rPRg== +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: - agentkeepalive "^4.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^9.0.0" + semver "^7.5.3" -make-fetch-happen@^10.0.6: - 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== +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.0.3, 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.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" + 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 "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" + minipass "^5.0.0" + minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^0.6.3" promise-retry "^2.0.1" socks-proxy-agent "^7.0.0" - ssri "^9.0.0" + ssri "^10.0.0" map-age-cleaner@^0.1.1: version "0.1.3" @@ -10215,18 +10024,18 @@ matcher@^3.0.0: escape-string-regexp "^4.0.0" mdast-util-definitions@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz#2c1d684b28e53f84938bb06317944bee8efa79db" - integrity sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ== + 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 "^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" @@ -10242,28 +10051,27 @@ mdast-util-from-markdown@^1.0.0: uvu "^0.5.0" mdast-util-to-hast@^12.1.0: - version "12.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.1.2.tgz#5c793b04014746585254c7ce0bc2d117201a5d1d" - integrity sha512-Wn6Mcj04qU4qUXHnHpPATYMH2Jd8RlntdnloDfYLe1ErWRHo6+pvSl/DzHp6sCZ9cBSYlc8Sk8pbwb8xtUoQhQ== + 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" + micromark-util-sanitize-uri "^1.1.0" trim-lines "^3.0.0" - unist-builder "^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 sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== @@ -10292,7 +10100,7 @@ memoize-one@^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== @@ -10314,12 +10122,19 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +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== @@ -10330,9 +10145,9 @@ methods@^1.1.2, methods@~1.1.2: 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" @@ -10352,18 +10167,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" @@ -10371,28 +10186,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" @@ -10400,48 +10214,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" @@ -10449,42 +10263,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.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" - integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== + 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" @@ -10492,19 +10306,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" @@ -10524,7 +10338,7 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@^3.1.10, micromatch@^3.1.4: +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== @@ -10543,7 +10357,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -10556,7 +10370,7 @@ mime-db@1.52.0, mime-db@^1.28.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-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== @@ -10568,7 +10382,7 @@ mime@1.6.0, mime@^1.4.1: 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== @@ -10583,7 +10397,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== @@ -10598,15 +10417,20 @@ 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.6.1" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz#9a1251d15f2035c342d99a468ab9da7a0451b71e" - integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== dependencies: schema-utils "^4.0.0" @@ -10629,17 +10453,38 @@ minimatch@3.0.5: dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +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: + 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.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" @@ -10653,9 +10498,9 @@ minimist-options@4.1.0: kind-of "^6.0.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== + 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" @@ -10664,12 +10509,12 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" -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.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" + integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== dependencies: - minipass "^3.1.6" + minipass "^5.0.0" minipass-sized "^1.0.3" minizlib "^2.1.2" optionalDependencies: @@ -10704,34 +10549,27 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -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.1, minipass@^3.1.6: - version "3.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" - integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== +minipass@^3.0.0, minipass@^3.1.1: + 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" -minipass@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.0.tgz#7cebb0f9fa7d56f0c5b17853cbe28838a8dbbd3b" - integrity sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw== - dependencies: - yallist "^4.0.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== -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@^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": + version "7.0.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.2.tgz#58a82b7d81c7010da5bd4b2c0c85ac4b4ec5131e" + integrity sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -10741,6 +10579,11 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" +mitt@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.0.tgz#69ef9bd5c80ff6f57473e8d89326d01c414be0bd" + integrity sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ== + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -10754,15 +10597,6 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp-infer-owner@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" - integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== - dependencies: - chownr "^2.0.0" - infer-owner "^1.0.4" - mkdirp "^1.0.3" - mkdirp@0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -10770,7 +10604,7 @@ mkdirp@0.5.5: 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: +"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== @@ -10782,6 +10616,33 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mocha@^10.1.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + mocha@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" @@ -10817,12 +10678,12 @@ mockdate@^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: +moment@^2.18.1, moment@^2.24.0, moment@^2.25.3: version "2.29.4" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== @@ -10836,14 +10697,12 @@ mount-point@^3.0.0: pify "^2.3.0" pinkie-promise "^2.0.1" -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" @@ -10870,26 +10729,26 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -msgpackr-extract@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-2.1.2.tgz#56272030f3e163e1b51964ef8b1cd5e7240c03ed" - integrity sha512-cmrmERQFb19NX2JABOGtrKdHMyI6RUyceaPBQ2iRz9GnDkjBWFjNJC0jyyoOfZl2U/LZE3tQCCQc4dlRyA8mcA== +msgpackr-extract@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz#e05ec1bb4453ddf020551bcd5daaf0092a2c279d" + integrity sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A== dependencies: - node-gyp-build-optional-packages "5.0.3" + node-gyp-build-optional-packages "5.0.7" optionalDependencies: - "@msgpackr-extract/msgpackr-extract-darwin-arm64" "2.1.2" - "@msgpackr-extract/msgpackr-extract-darwin-x64" "2.1.2" - "@msgpackr-extract/msgpackr-extract-linux-arm" "2.1.2" - "@msgpackr-extract/msgpackr-extract-linux-arm64" "2.1.2" - "@msgpackr-extract/msgpackr-extract-linux-x64" "2.1.2" - "@msgpackr-extract/msgpackr-extract-win32-x64" "2.1.2" + "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.2" + "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.2" + "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.2" msgpackr@^1.6.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.7.2.tgz#68d6debf5999d6b61abb6e7046a689991ebf7261" - integrity sha512-mWScyHTtG6TjivXX9vfIy2nBtRupaiAj0HQ2mtmpmYujAmqZmaaEVPaSZ1NKLMvicaMLFzEaMk0ManxMRg8rMQ== + version "1.9.5" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.9.5.tgz#ac548c5f4546db895e84e46d39d813be961dc527" + integrity sha512-/IJ3cFSN6Ci3eG2wLhbFEL6GT63yEaoN/R5My2QkV6zro+OJaVRLPlwvxY7EtHYSmDlQpk8stvOQTL2qJFkDRg== optionalDependencies: - msgpackr-extract "^2.1.2" + msgpackr-extract "^3.0.2" multer@1.4.4-lts.1: version "1.4.4-lts.1" @@ -10904,7 +10763,7 @@ multer@1.4.4-lts.1: type-is "^1.6.4" xtend "^4.0.0" -multimatch@^5.0.0: +multimatch@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== @@ -10915,15 +10774,20 @@ multimatch@^5.0.0: arrify "^2.0.1" minimatch "^3.0.4" -mute-stream@0.0.8, 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== +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.16.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" - integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== nano@^9.0.5: version "9.0.5" @@ -10936,10 +10800,15 @@ nano@^9.0.5: qs "^6.9.4" tough-cookie "^4.0.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== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== nanomatch@^1.2.9: version "1.2.13" @@ -10973,6 +10842,11 @@ native-request@^1.0.5: resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.1.0.tgz#acdb30fe2eefa3e1bc8c54b3a6852e9c5c0d3cb0" integrity sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw== +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" @@ -10993,11 +10867,18 @@ neo-async@^2.6.0, neo-async@^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, nested-error-stacks@^2.1.0: +nested-error-stacks@^2.1.1: 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-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: + ts-error "^1.0.6" + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -11011,10 +10892,10 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-abi@*, node-abi@^3.0.0, node-abi@^3.3.0: - version "3.22.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.22.0.tgz#00b8250e86a0816576258227edbce7bbe0039362" - integrity sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w== +node-abi@*, node-abi@^3.0.0: + version "3.45.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.45.0.tgz#f568f163a3bfca5aacfce1fbeee1fa2cc98441f5" + integrity sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ== dependencies: semver "^7.3.5" @@ -11025,20 +10906,20 @@ node-abi@^2.21.0, node-abi@^2.7.0: dependencies: semver "^5.4.1" -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.0.2, 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@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== node-api-version@^0.1.4: version "0.1.4" @@ -11047,6 +10928,11 @@ node-api-version@^0.1.4: dependencies: semver "^7.3.5" +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-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" @@ -11055,54 +10941,71 @@ node-environment-flags@1.0.6: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@2.6.7, 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-optional-packages@5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz#92a89d400352c44ad3975010368072b41ad66c17" - integrity sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA== +node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^3.2.10: + version "3.3.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.1.tgz#b3eea7b54b3a48020e46f4f88b9c5a7430d20b2e" + integrity sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + +node-gyp-build-optional-packages@5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz#5d2632bbde0ab2f6e22f1bbac2199b07244ae0b3" + integrity sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w== node-gyp-build@^4.2.1, node-gyp-build@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" - integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== + version "4.6.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== -node-gyp@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.1.0.tgz#c8d8e590678ea1f7b8097511dedf41fc126648f8" - integrity sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g== +node-gyp@^9.0.0, node-gyp@^9.3.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" + integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== 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" + make-fetch-happen "^11.0.3" + 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-gyp@^9.3.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.0.tgz#f8eefe77f0ad8edb3b3b898409b53e697642b319" - integrity sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q== +node-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-loader/-/node-loader-2.0.0.tgz#9109a6d828703fd3e0aa03c1baec12a798071562" + integrity sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q== dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.6" - make-fetch-happen "^10.0.3" - nopt "^6.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" + loader-utils "^2.0.0" + +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-pty@0.11.0-beta17: version "0.11.0-beta17" @@ -11111,15 +11014,10 @@ node-pty@0.11.0-beta17: dependencies: nan "^2.14.0" -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== - -node-uuid@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" - integrity sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA== +node-releases@^2.0.12: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== noop-logger@^0.1.1: version "0.1.1" @@ -11150,7 +11048,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: 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== @@ -11160,12 +11058,12 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" -normalize-package-data@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-4.0.1.tgz#b46b24e0616d06cadf9d5718b29b6d445a82a62c" - integrity sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg== +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 "^5.0.0" + hosted-git-info "^6.0.0" is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" @@ -11175,51 +11073,34 @@ normalize-path@^3.0.0, normalize-path@~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: 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.1.1: +normalize-url@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.0.tgz#593dbd284f743e8dcf6a5ddf8fadff149c82701a" + integrity sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw== + +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-bundled@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-2.0.1.tgz#94113f7eb342cd7a67de1e789f896b04d2c600f4" - integrity sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw== - dependencies: - npm-normalize-package-bin "^2.0.0" - -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.0" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== dependencies: - config-chain "^1.1.11" - pify "^3.0.0" + npm-normalize-package-bin "^3.0.0" -npm-install-checks@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-5.0.0.tgz#5ff27d209a4e3542b8ac6b0c1db6063506248234" - integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA== +npm-install-checks@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.1.1.tgz#b459b621634d06546664207fde16810815808db1" + integrity sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw== dependencies: semver "^7.1.1" @@ -11228,10 +11109,10 @@ npm-normalize-package-bin@^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-normalize-package-bin@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz#9447a1adaaf89d8ad0abe24c6c84ad614a675fff" - integrity sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ== +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" @@ -11242,55 +11123,55 @@ npm-package-arg@8.1.1: semver "^7.0.0" validate-npm-package-name "^3.0.0" -npm-package-arg@^9.0.0, npm-package-arg@^9.0.1: - version "9.1.2" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.1.2.tgz#fc8acecb00235f42270dda446f36926ddd9ac2bc" - integrity sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg== +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 "^5.0.0" - proc-log "^2.0.1" + hosted-git-info "^6.0.0" + proc-log "^3.0.0" semver "^7.3.5" - validate-npm-package-name "^4.0.0" + validate-npm-package-name "^5.0.0" -npm-packlist@^5.1.0, npm-packlist@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.3.tgz#69d253e6fd664b9058b85005905012e00e69274b" - integrity sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg== +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: glob "^8.0.1" ignore-walk "^5.0.1" - npm-bundled "^2.0.0" - npm-normalize-package-bin "^2.0.0" + npm-bundled "^1.1.2" + npm-normalize-package-bin "^1.0.1" -npm-pick-manifest@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz#1d372b4e7ea7c6712316c0e99388a73ed3496e84" - integrity sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw== +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: + ignore-walk "^6.0.0" + +npm-pick-manifest@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz#c6acd97d1ad4c5dbb80eac7b386b03ffeb289e5f" + integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== dependencies: - npm-install-checks "^5.0.0" - npm-normalize-package-bin "^2.0.0" - npm-package-arg "^9.0.0" + 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@^13.0.0, npm-registry-fetch@^13.0.1, npm-registry-fetch@^13.3.0: - version "13.3.1" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz#bb078b5fa6c52774116ae501ba1af2a33166af7e" - integrity sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw== +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: - make-fetch-happen "^10.0.6" - minipass "^3.1.6" - minipass-fetch "^2.0.3" + 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 "^9.0.1" - proc-log "^2.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 sha512-PrGAi1SLlqNvKN5uGBjIgnrTb8fl0Jz0a3JJmeMcGnIBh7UE9Gc4zsAMlwDajOMg2b1OgP6UPvoLUboTmMZPFA== - dependencies: - path-key "^1.0.0" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" npm-run-path@^2.0.0: version "2.0.2" @@ -11299,13 +11180,27 @@ npm-run-path@^2.0.0: 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" +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + 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" @@ -11336,37 +11231,35 @@ npmlog@^6.0.0, npmlog@^6.0.2: gauge "^4.0.3" set-blocking "^2.0.0" -nsfw@^2.1.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-2.2.2.tgz#9fc64a0ca4bc38e180dd74935e0f295913e2153f" - integrity sha512-a2xt1Nx8Sz+E8eA5Ehgb3UONlrk1s5TpeoVh1XiqS0AI0wI94B7x4qoh6C11rNNX4fPOc3iC/wh4mcY9GWOgOQ== +nsfw@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-2.2.4.tgz#4ed94544a63fc843b7e3ccff6668dce13d27a33a" + integrity sha512-sTRNa7VYAiy5ARP8etIBfkIfxU0METW40UinDnv0epQMe1pzj285HdXKRKkdrV3rRzMNcuNZn2foTNszV0x+OA== dependencies: - node-addon-api "*" + node-addon-api "^5.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 sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== -nwsapi@^2.0.7: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== +nwsapi@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -nx@15.3.0, "nx@>=14.8.6 < 16": - version "15.3.0" - resolved "https://registry.yarnpkg.com/nx/-/nx-15.3.0.tgz#50916064145cf33ba68fb8bd03ff8ffc2b9ebc7b" - integrity sha512-5tBrEF2zDkGBDfe8wThazJqBDhsVkRrxc6OttzfBmkXP4VPp8w5MMtUEOry181AXKfjDGkw//UnCSkUNynTDlw== +nx@16.5.2, "nx@>=16.5.1 < 17": + version "16.5.2" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.5.2.tgz#a271513abe73324fdf2924277d5f273d807a6f0e" + integrity sha512-3XAkVBhXuoFgD7r0lASOh2589XSmBUjioevZb13lDjKDN/FHFWedwMZWtmmbzxBGO3EAWjl+3owBS1RIPm1UHw== dependencies: - "@nrwl/cli" "15.3.0" - "@nrwl/tao" "15.3.0" + "@nrwl/tao" "16.5.2" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" - "@yarnpkg/parsers" "^3.0.0-rc.18" + "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" axios "^1.0.0" - chalk "4.1.0" - chokidar "^3.5.1" + chalk "^4.1.0" cli-cursor "3.1.0" cli-spinners "2.6.1" cliui "^7.0.2" @@ -11375,29 +11268,36 @@ nx@15.3.0, "nx@>=14.8.6 < 16": fast-glob "3.2.7" figures "3.2.0" flat "^5.0.2" - fs-extra "^10.1.0" + fs-extra "^11.1.0" glob "7.1.4" ignore "^5.0.4" js-yaml "4.1.0" jsonc-parser "3.2.0" + lines-and-columns "~2.0.3" minimatch "3.0.5" npm-run-path "^4.0.1" open "^8.4.0" - semver "7.3.4" + 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 "^3.9.0" + tsconfig-paths "^4.1.2" tslib "^2.3.0" v8-compile-cache "2.3.0" yargs "^17.6.2" yargs-parser "21.1.1" - -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== + optionalDependencies: + "@nx/nx-darwin-arm64" "16.5.2" + "@nx/nx-darwin-x64" "16.5.2" + "@nx/nx-freebsd-x64" "16.5.2" + "@nx/nx-linux-arm-gnueabihf" "16.5.2" + "@nx/nx-linux-arm64-gnu" "16.5.2" + "@nx/nx-linux-arm64-musl" "16.5.2" + "@nx/nx-linux-x64-gnu" "16.5.2" + "@nx/nx-linux-x64-musl" "16.5.2" + "@nx/nx-win32-arm64-msvc" "16.5.2" + "@nx/nx-win32-x64-msvc" "16.5.2" object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -11413,10 +11313,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-keys@^1.0.11, object-keys@^1.1.1: version "1.1.1" @@ -11440,51 +11340,52 @@ object.assign@4.1.0: 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== +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" 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== +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -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== +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" object.getownpropertydescriptors@^2.0.3: - version "2.1.4" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37" - integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ== + version "2.1.6" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" + integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== dependencies: - array.prototype.reduce "^1.0.4" + array.prototype.reduce "^1.0.5" call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.1" + define-properties "^1.2.0" + es-abstract "^1.21.2" + safe-array-concat "^1.0.0" -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.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" object.pick@^1.3.0: version "1.3.0" @@ -11493,14 +11394,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -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: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" on-finished@2.4.1: version "2.4.1" @@ -11523,38 +11424,33 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +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: + mimic-fn "^4.0.0" + open@^8.0.6, open@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + 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" - -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.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" 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" ora@^5.1.0, ora@^5.4.1: version "5.4.1" @@ -11590,36 +11486,24 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -p-all@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-all/-/p-all-2.1.0.tgz#91419be56b7dee8fe4c5db875d55e0da084244a0" - integrity sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA== - dependencies: - p-map "^2.0.0" - -p-any@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-any/-/p-any-3.0.0.tgz#79847aeed70b5d3a10ea625296c0c3d2e90a87b9" - integrity sha512-5rqbqfsRWNb0sukt0awwgJMlaep+8jV45S15SKKB34z4UuzjcofIfnriCBhWjZP2jbVtjt9yRl7buB6RlKsu9w== +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 "^2.0.0" - p-some "^5.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== - -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-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" @@ -11630,36 +11514,29 @@ p-defer@^1.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== -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== - dependencies: - p-timeout "^2.0.1" - -p-event@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" - integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== +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 "^3.1.0" + p-timeout "^5.0.2" -p-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" - integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== +p-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-3.0.0.tgz#ce50e03b24b23930e11679ab8694bd09a2d7ed35" + integrity sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg== dependencies: - p-map "^2.0.0" + p-map "^5.1.0" p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== -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 sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg== +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-is-promise@^2.0.0: version "2.1.0" @@ -11680,7 +11557,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== @@ -11708,41 +11585,43 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map-series@^2.1.0: +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-limit "^3.0.2" + +p-map-series@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== -p-map@^2.0.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" - -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@^3.1.0: +p-map@^5.1.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" + integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== + dependencies: + aggregate-error "^4.0.0" + +p-map@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-6.0.0.tgz#4d9c40d3171632f86c47601b709f4b4acd70fed4" + integrity sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw== + +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@^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@^6.6.2: +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== @@ -11750,75 +11629,75 @@ p-queue@^6.6.2: eventemitter3 "^4.0.4" p-timeout "^3.2.0" -p-reduce@^2.0.0, p-reduce@^2.1.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-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-some@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-some/-/p-some-5.0.0.tgz#8b730c74b4fe5169d7264a240ad010b6ebc686a4" - integrity sha512-Js5XZxo6vHjB9NOYAzWDYAIyyiPvva0DWESAIWIK7uhSpGsyg5FwUPxipU/SOQx5x9EqhOh545d1jo6cVkitig== - dependencies: - aggregate-error "^3.0.0" - p-cancelable "^2.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-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: - p-finally "^1.0.0" + aggregate-error "^4.0.0" + p-cancelable "^3.0.0" -p-timeout@^3.1.0, p-timeout@^3.2.0: +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 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@^2.1.1: +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 "^2.0.0" -pacote@^13.0.3, pacote@^13.6.1: - version "13.6.2" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.2.tgz#0d444ba3618ab3e5cd330b451c22967bbd0ca48a" - integrity sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg== - dependencies: - "@npmcli/git" "^3.0.0" - "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/promise-spawn" "^3.0.0" - "@npmcli/run-script" "^4.1.0" - cacache "^16.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - infer-owner "^1.0.4" - minipass "^3.1.6" - mkdirp "^1.0.4" - npm-package-arg "^9.0.0" - npm-packlist "^5.1.0" - npm-pick-manifest "^7.0.0" - npm-registry-fetch "^13.0.1" - proc-log "^2.0.0" +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 "^5.0.0" - read-package-json-fast "^2.0.3" - rimraf "^3.0.2" - ssri "^9.0.0" + 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: @@ -11836,15 +11715,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-conflict-json@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz#3d05bc8ffe07d39600dc6436c6aefe382033d323" - integrity sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA== - dependencies: - json-parse-even-better-errors "^2.3.1" - just-diff "^5.0.1" - just-diff-apply "^5.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" @@ -11877,10 +11747,12 @@ parse-url@^8.1.0: dependencies: parse-path "^7.0.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== +parse5@^7.0.0, parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" parseurl@~1.3.3: version "1.3.3" @@ -11913,11 +11785,6 @@ 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 sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -11933,11 +11800,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" - integrity sha512-T3hWy7tyXlk3QvPFnT+o2tmXRzU4GkitkUWLp/WZ0S/FXd7XMx176tRurgTvHTNMJOQzTcesHNpBqetH86mQ9g== - 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" @@ -11948,11 +11810,36 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +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-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-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: + path-root-regex "^0.1.0" + +path-scurry@^1.10.1, path-scurry@^1.6.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + 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" @@ -11982,6 +11869,11 @@ pause-stream@0.0.11: dependencies: through "~2.3" +peek-readable@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.0.0.tgz#7ead2aff25dc40458c60347ea76cfdfd63efdfec" + integrity sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A== + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -11992,11 +11884,6 @@ perfect-scrollbar@^1.3.0, perfect-scrollbar@^1.5.0: 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 sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -12007,7 +11894,12 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.2.0, pify@^2.3.0: +pify@5.0.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 sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== @@ -12022,11 +11914,6 @@ pify@^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" @@ -12060,10 +11947,14 @@ 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.1, plist@^3.0.4: + 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" @@ -12075,10 +11966,10 @@ postcss-modules-extract-imports@^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== -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-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" @@ -12099,9 +11990,9 @@ postcss-modules-values@^4.0.0: 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== + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -12111,12 +12002,12 @@ 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.21: + version "8.4.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" + integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -12160,39 +12051,11 @@ prebuild-install@^6.0.0: tar-fs "^2.0.0" tunnel-agent "^0.6.0" -prebuild-install@^7.0.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== - 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" - 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 sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - 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" @@ -12201,40 +12064,44 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.3.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + 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.6.1: + version "29.6.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.1.tgz#ec838c288850b7c4f9090b867c2d4f4edbfb0f3e" + integrity sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog== + dependencies: + "@jest/schemas" "^29.6.0" + 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@^2.0.0, proc-log@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" - integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== +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, 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== -promise-all-reject-late@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" - integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== - -promise-call-limit@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.1.tgz#4bdee03aeb85674385ca934da7114e9bcd3c6e24" - integrity sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q== - promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -12248,14 +12115,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 sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw== +promzard@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" + integrity sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig== dependencies: - read "1" + read "^2.0.0" -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.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== @@ -12265,19 +12132,14 @@ prop-types@^15.0.0, prop-types@^15.5.0, prop-types@^15.5.6, prop-types@^15.6.0, 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 sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + version "6.2.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" + integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== -protobufjs@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.0.0.tgz#8c678e1351fd926178fce5a4213913e8d990974f" - integrity sha512-ffNIEm+quOcYtQvHdW406v1NQmZSuqVklxsXk076BtuFnlYZfigLU+JOMrTD8TUOyqHYbRI/fSVNvgd25YeN3w== +protobufjs@^7.2.3, protobufjs@^7.2.4: + version "7.2.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" + integrity sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -12289,22 +12151,21 @@ protobufjs@^7.0.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 "^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== + version "1.1.3" + resolved "https://registry.yarnpkg.com/protoc/-/protoc-1.1.3.tgz#d9857ec2a43a683af8263032d519ce7ba0b7d99e" + integrity sha512-Vy4OBxCcF0W38YrZZRFix659gFu8ujIxVDP1SUBK9ELzyeMSBe8m8tYyYlX1PI5j9gse9hWu4c4nzQaHesAf8Q== 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" + 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" protocols@^2.0.0, protocols@^2.0.1: version "2.0.1" @@ -12319,7 +12180,7 @@ 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-from-env@1.1.0, 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== @@ -12341,18 +12202,18 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== -psl@^1.1.28, psl@^1.1.33: +psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -public-ip@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/public-ip/-/public-ip-4.0.4.tgz#b3784a5a1ff1b81d015b9a18450be65ffd929eb3" - integrity sha512-EJ0VMV2vF6Cu7BIPo3IMW1Maq6ME+fbR0NcPmqDfpfNGIRPue1X8QrGjrg/rfjDkOsIkKHIf2S5FlEa48hFMTA== +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 "^9.6.0" + got "^12.0.0" is-ip "^3.1.0" pump@^1.0.0: @@ -12371,12 +12232,29 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -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: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +puppeteer-core@19.11.1, puppeteer-core@^19.7.2: + version "19.11.1" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.11.1.tgz#4c63d7a0a6cd268ff054ebcac315b646eee32667" + integrity sha512-qcuC2Uf0Fwdj9wNtaTZ2OvYRraXpAK+puwwVW8ofOhOgLPZyz1c68tsorfIZyCUOpyBisjr+xByu7BMbEYMepA== + dependencies: + "@puppeteer/browsers" "0.5.0" + chromium-bidi "0.4.7" + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.1107588" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + proxy-from-env "1.1.0" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.13.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== @@ -12386,70 +12264,57 @@ 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 sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== +puppeteer@^19.7.2: + version "19.11.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.11.1.tgz#bb75d518e87b0b4f6ef9bad1ea7e9d1cdcd18a5d" + integrity sha512-39olGaX2djYUdhaQQHDZ0T0GwEp+5f9UB9HmEP0qHfdQHIq0xGQZuAZ5TLnJIc/88SrPLpEflPC+xUqOTv3c5g== dependencies: - side-channel "^1.0.4" + "@puppeteer/browsers" "0.5.0" + cosmiconfig "8.1.3" + https-proxy-agent "5.0.1" + progress "2.0.3" + proxy-from-env "1.1.0" + puppeteer-core "19.11.1" -qs@^6.10.1, qs@^6.9.4: +qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 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== - -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.10.1, qs@^6.10.3, qs@^6.11.0, qs@^6.9.4: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" + side-channel "^1.0.4" 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" +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== +queue-tick@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== + quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -12482,6 +12347,16 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +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" + iconv-lite "0.4.24" + unpipe "1.0.0" + rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -12525,9 +12400,9 @@ react-is@^18.0.0: integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== 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" @@ -12540,7 +12415,7 @@ 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" @@ -12554,9 +12429,9 @@ react-perfect-scrollbar@^1.5.3, react-perfect-scrollbar@^1.5.8: prop-types "^15.6.1" react-select@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.6.0.tgz#d987f4c86b3dcd32307a0104e503e4e8a9777a34" - integrity sha512-uUvP/72rA8NGhOL16RVBaeC12Wa4NUE0iXIa6hz0YRno9ZgxTmpuMeKzjR7vHcwmigpVCoe0prP+3NVb6Obq8Q== + version "5.7.4" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.4.tgz#d8cad96e7bc9d6c8e2709bdda8f4363c5dd7ea7d" + integrity sha512-NhuE56X+p9QDFh4BgeygHFIvJJszO1i1KSkg/JPcIJrbovyRtI+GuOEa4XzFCEpZRAEoEI8u/cAHK+jG/PgUzQ== dependencies: "@babel/runtime" "^7.12.0" "@emotion/cache" "^11.4.0" @@ -12577,17 +12452,17 @@ react-tabs@^3.1.2: 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" @@ -12603,9 +12478,9 @@ react-virtuoso@^2.17.0: "@virtuoso.dev/urx" "^0.2.12" react-window@^1.8.6: - version "1.8.8" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.8.tgz#1b52919f009ddf91970cbdb2050a6c7be44df243" - integrity sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ== + version "1.8.9" + resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.9.tgz#24bc346be73d0468cdf91998aac94e32bc7fa6a8" + integrity sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q== dependencies: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" @@ -12617,28 +12492,39 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" -read-cmd-shim@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.1.tgz#868c235ec59d1de2db69e11aec885bc095aea087" - integrity sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g== +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-fast@^2.0.2, read-package-json-fast@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" - integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== +read-config-file@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade" + integrity sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg== dependencies: - json-parse-even-better-errors "^2.3.0" - npm-normalize-package-bin "^1.0.1" + 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-json@^5.0.0, read-package-json@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.2.tgz#b8779ccfd169f523b67208a89cc912e3f663f3fa" - integrity sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q== +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: - glob "^8.0.1" - json-parse-even-better-errors "^2.3.1" - normalize-package-data "^4.0.0" - npm-normalize-package-bin "^2.0.0" + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +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: + 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" @@ -12676,36 +12562,17 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -read@1, read@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== - dependencies: - mute-stream "~0.0.4" - -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -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== +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: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" + mute-stream "~1.0.0" -readable-stream@^2.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.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +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" @@ -12715,15 +12582,21 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdir-scoped-modules@^1.1.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@^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: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-web-to-node-stream@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" + integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== + dependencies: + readable-stream "^3.6.0" readdirp@~3.2.0: version "3.2.0" @@ -12776,10 +12649,10 @@ reflect-metadata@^0.1.10: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== -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== +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== dependencies: regenerate "^1.4.2" @@ -12788,20 +12661,15 @@ 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.10: - version "0.13.10" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== - -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.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -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.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" @@ -12813,41 +12681,31 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.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.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" -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== - -regexpu-core@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" - integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" - regenerate-unicode-properties "^10.0.1" - regjsgen "^0.6.0" - regjsparser "^0.8.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.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== - -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== +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" @@ -12859,9 +12717,9 @@ relative@^3.0.2: isobject "^2.0.0" 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" @@ -12895,65 +12753,15 @@ repeat-element@^1.1.2: 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 sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -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" +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +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== require-directory@^2.1.1: version "2.1.1" @@ -12975,7 +12783,12 @@ require-main-filename@^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== @@ -12987,15 +12800,22 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +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-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-url@^0.2.1: version "0.2.1" @@ -13003,15 +12823,15 @@ resolve-url@^0.2.1: integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.9.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.11.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: +resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== @@ -13020,13 +12840,6 @@ resolve@^2.0.0-next.3: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -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 sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - responselike@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" @@ -13034,6 +12847,13 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" +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: + lowercase-keys "^3.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -13076,6 +12896,13 @@ rimraf@^3.0.0, rimraf@^3.0.2: 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@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -13100,6 +12927,11 @@ route-parser@^0.0.5: resolved "https://registry.yarnpkg.com/route-parser/-/route-parser-0.0.5.tgz#7d1d09d335e49094031ea16991a4a79b01bbe1f4" integrity sha512-nsii+MXoNb7NyF05LP9kaktx6AoBVT/7zUgDnzIb5IoYAvYkbZOAuoLJjVdsyEVxWv0swCxWkKDK4cMva+WDBA== +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" @@ -13112,17 +12944,10 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.1: - version "7.5.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" - integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== - dependencies: - tslib "^2.1.0" - -rxjs@^7.5.5: - version "7.6.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.6.0.tgz#361da5362b6ddaa691a2de0b4f2d32028f1eb5a2" - integrity sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ== +rxjs@^7.5.1, rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" @@ -13133,7 +12958,17 @@ 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.1, safe-buffer@~5.2.0: +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +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== @@ -13143,6 +12978,15 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -13150,16 +12994,35 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"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: +safe-stable-stringify@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +"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== +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.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -13176,26 +13039,26 @@ 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, schema-utils@^3.1.1, schema-utils@^3.2.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== + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== 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" -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== @@ -13213,40 +13076,33 @@ semver-compare@^1.0.0: integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.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.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== +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" -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@^6.0.0, semver@^6.2.0, semver@^6.3.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.7: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== +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: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" -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== - dependencies: - lru-cache "^6.0.0" +semver@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== send@0.18.0: version "0.18.0" @@ -13283,6 +13139,13 @@ serialize-error@^7.0.1: dependencies: type-fest "^0.13.1" +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== + dependencies: + randombytes "^2.1.0" + serialize-javascript@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" @@ -13290,10 +13153,10 @@ 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.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" @@ -13404,11 +13267,25 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +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.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + +sigstore@^1.3.0, sigstore@^1.4.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.7.0.tgz#9186e6c8ce1ab0cba5d97b414212d40f0a01564e" + integrity sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q== + dependencies: + "@sigstore/protobuf-specs" "^0.1.0" + "@sigstore/tuf" "^1.0.1" + 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" @@ -13423,29 +13300,27 @@ 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@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" + integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" + semver "~7.0.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 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== +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== slice-ansi@^3.0.0: version "3.0.0" @@ -13465,7 +13340,7 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.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== @@ -13508,40 +13383,43 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socket.io-adapter@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" - integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== +socket.io-adapter@~2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12" + integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA== + dependencies: + ws "~8.11.0" socket.io-client@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.5.3.tgz#bed69209d001465b2fea650d2e95c1e82768ab5e" - integrity sha512-I/hqDYpQ6JKwtJOf5ikM+Qz+YujZPMEl6qBLhxiP0nX+TfXKhW4KZZG8lamrD6Y5ngjmYHreESVasVCgi5Kl3A== + version "4.7.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.1.tgz#48e5f703abe4fb0402182bcf9c06b7820fb3453b" + integrity sha512-Qk3Xj8ekbnzKu3faejo4wk2MzXA029XppiXtTF/PkbTg+fcwaTw1PlDrTrrrU4mKoYC4dvlApOnSeyLCKwek2w== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" - engine.io-client "~6.2.3" - socket.io-parser "~4.2.0" + engine.io-client "~6.5.1" + socket.io-parser "~4.2.4" -socket.io-parser@~4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.1.tgz#01c96efa11ded938dcb21cbe590c26af5eff65e5" - integrity sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g== +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.1.0" debug "~4.3.1" socket.io@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.3.tgz#44dffea48d7f5aa41df4a66377c386b953bc521c" - integrity sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg== + version "4.7.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.1.tgz#9009f31bf7be25478895145e92fbc972ad1db900" + integrity sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw== dependencies: accepts "~1.3.4" base64id "~2.0.0" + cors "~2.8.5" debug "~4.3.2" - engine.io "~6.2.0" - socket.io-adapter "~2.4.0" - socket.io-parser "~4.2.0" + engine.io "~6.5.0" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" socks-proxy-agent@^5.0.0: version "5.0.1" @@ -13562,9 +13440,9 @@ socks-proxy-agent@^7.0.0: socks "^2.6.2" socks@^2.3.3, socks@^2.6.2: - version "2.7.0" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.0.tgz#f9225acdb841e874dca25f870e9130990f3913d0" - integrity sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA== + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== dependencies: ip "^2.0.0" smart-buffer "^4.2.0" @@ -13590,13 +13468,6 @@ sort-keys@^2.0.0: dependencies: is-plain-obj "^1.0.0" -sort-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-4.2.0.tgz#6b7638cee42c506fff8c1cecde7376d21315be18" - integrity sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg== - dependencies: - is-plain-obj "^2.0.0" - source-map-js@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" @@ -13651,14 +13522,14 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 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" @@ -13677,9 +13548,9 @@ 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.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== split-on-first@^1.0.0: version "1.1.0" @@ -13693,7 +13564,7 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -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== @@ -13707,7 +13578,7 @@ split@0.3: 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== @@ -13724,28 +13595,25 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== +ssri@^10.0.0, ssri@^10.0.1: + version "10.0.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" + integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== 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@^9.0.0, ssri@^9.0.1: + minipass "^5.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" +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== + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -13759,11 +13627,6 @@ statuses@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 sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== - stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -13776,10 +13639,13 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== +streamx@^2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.0.tgz#f58c92e6f726b5390dcabd6dd9094d29a854d698" + integrity sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg== + dependencies: + fast-fifo "^1.1.0" + queue-tick "^1.0.1" strict-uri-encode@^2.0.0: version "2.0.0" @@ -13809,6 +13675,15 @@ string-replace-loader@^3.1.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +"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== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -13826,15 +13701,6 @@ string-width@^1.0.1: 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: - 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== - dependencies: - emoji-regex "^8.0.0" - 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" @@ -13844,37 +13710,55 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.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: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" has-symbols "^1.0.3" internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" + regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" -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.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" -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.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string_decoder@^1.1.1: version "1.3.0" @@ -13883,11 +13767,6 @@ string_decoder@^1.1.1: 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 sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -13895,7 +13774,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== @@ -13904,6 +13783,13 @@ stringify-object@3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +"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-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" @@ -13925,12 +13811,12 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -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== +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: - ansi-regex "^5.0.1" + ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -13949,6 +13835,14 @@ 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" @@ -13959,6 +13853,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +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" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" @@ -13971,24 +13870,29 @@ strip-json-comments@2.0.1, strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +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-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" +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== + striptags@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052" integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw== -strong-log-transformer@^2.1.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== @@ -13997,17 +13901,25 @@ strong-log-transformer@^2.1.0: minimist "^1.2.0" through "^2.3.4" +strtok3@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-7.0.0.tgz#868c428b4ade64a8fd8fee7364256001c1a4cbe5" + integrity sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ== + dependencies: + "@tokenizer/token" "^0.3.0" + peek-readable "^5.0.0" + style-dictionary@^3.7.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/style-dictionary/-/style-dictionary-3.7.1.tgz#d61c980513d7bb0a1946a9fab31491a672d0f6a2" - integrity sha512-yYU9Z/J8Znj9T9oJVjo8VOYamrOxv0UbBKPjhSt+PharxrhyQCM4RWb71fgEfv2pK9KO8G83/0ChDNQZ1mn0wQ== + version "3.8.0" + resolved "https://registry.yarnpkg.com/style-dictionary/-/style-dictionary-3.8.0.tgz#7cb8d64360c53431f768d44def665f61e971a73e" + integrity sha512-wHlB/f5eO3mDcYv6WtOz6gvQC477jBKrwuIXe+PtHskTCBsJdAOvL8hCquczJxDui2TnwpeNE+2msK91JJomZg== 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" + json5 "^2.2.2" jsonc-parser "^3.0.0" lodash "^4.17.15" tinycolor2 "^1.4.1" @@ -14020,17 +13932,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.1" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37" + integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== dependencies: inline-style-parser "0.1.1" -stylis@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== success-symbol@^0.1.0: version "0.1.0" @@ -14044,22 +13956,22 @@ 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" @@ -14094,27 +14006,26 @@ 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: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@2.1.1, 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== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + tar-fs@^1.16.2: version "1.16.3" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" @@ -14125,16 +14036,6 @@ tar-fs@^1.16.2: pump "^1.0.0" 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== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - 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" @@ -14159,20 +14060,16 @@ tar-stream@^2.1.4, tar-stream@~2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^4.0.0: - 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: + version "3.1.6" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.6.tgz#6520607b55a06f4a2e2e04db360ba7d338cc5bab" + integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== 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.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== @@ -14184,19 +14081,19 @@ tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -tar@^6.1.0: - version "6.1.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" - integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== +tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^4.0.0" + minipass "^5.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" -temp-dir@^1.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 sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== @@ -14206,6 +14103,14 @@ temp-dir@^2.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" + temp@^0.9.1: version "0.9.4" resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" @@ -14214,24 +14119,24 @@ temp@^0.9.1: mkdirp "^0.5.1" rimraf "~2.6.2" -terser-webpack-plugin@^5.1.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" - integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== +terser-webpack-plugin@^5.3.7: + version "5.3.9" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: - "@jridgewell/trace-mapping" "^0.3.7" + "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.7.2" + serialize-javascript "^6.0.1" + terser "^5.16.8" -terser@^5.7.2: - version "5.14.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" - integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== +terser@^5.16.8: + version "5.19.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.1.tgz#dbd7231f224a9e2401d0f0959542ed74d76d340b" + integrity sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -14253,13 +14158,6 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -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" @@ -14270,15 +14168,10 @@ time-stamp@^1.0.1: resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" integrity sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw== -timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== - 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" @@ -14287,6 +14180,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" @@ -14294,7 +14194,7 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@~0.2.1: +tmp@^0.2.0, tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== @@ -14323,11 +14223,6 @@ to-object-path@^0.3.0: 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" @@ -14358,49 +14253,49 @@ toidentifier@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.0.0, tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== 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 sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== +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 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" @@ -14412,11 +14307,6 @@ tree-kill@^1.2.1: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -treeverse@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-2.0.0.tgz#036dcef04bc3fd79a9b79a68d4da03e882d8a9ca" - integrity sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A== - trim-lines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" @@ -14432,25 +14322,43 @@ trim-repeated@^1.0.0: resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== dependencies: - escape-string-regexp "^1.0.2" + 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== +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@^3.9.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== +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: - "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^2.2.2" minimist "^1.2.6" strip-bom "^3.0.0" @@ -14459,15 +14367,10 @@ tslib@^1.10.0, tslib@^1.8.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.3.0, tslib@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== tsutils@^3.21.0: version "3.21.0" @@ -14476,6 +14379,15 @@ 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" @@ -14483,16 +14395,6 @@ tunnel-agent@^0.6.0: 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 sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - 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" @@ -14500,13 +14402,6 @@ 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 sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -14547,10 +14442,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@^2.12.2: - version "2.17.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.17.0.tgz#c677030ce61e5be0c90c077d52571eb73c506ea9" - integrity sha512-U+g3/JVXnOki1kLSc+xZGPRll3Ah9u2VIG6Sn9iH9YX6UkPERmt6O/0fIyTgsd2/whV0+gAaHAg8fz6sG1QzMA== +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" @@ -14560,12 +14455,44 @@ type-is@^1.6.4, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -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== +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== dependencies: - is-typedarray "^1.0.0" + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" typedarray@^0.0.6: version "0.0.6" @@ -14579,10 +14506,15 @@ typeof-article@^0.1.1: dependencies: kind-of "^3.1.0" -"typescript@^3 || ^4": - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +"typescript@>=3 < 6": + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + +typescript@^4.9.3: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typescript@~4.5.5: version "4.5.5" @@ -14595,9 +14527,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.16.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.2.tgz#0481e1dbeed343ad1c2ddf3c6d42e89b7a6d4def" - integrity sha512-AaQNokTNgExWrkEYA24BTNMSjyqEXPSfhqoS0AxmHkCJ4U+Dyy5AvbGV/sqxuxficEfGGoX3zWw9R7QpLFfEsg== + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== umd-compat-loader@^2.1.2: version "2.1.2" @@ -14618,7 +14550,7 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -unbzip2-stream@^1.0.9: +unbzip2-stream@1.4.3, 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== @@ -14644,15 +14576,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.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== 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" @@ -14677,92 +14609,78 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -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== - dependencies: - unique-slug "^2.0.0" - -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 "^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== - dependencies: - imurmurhash "^0.1.4" - -unique-slug@^3.0.0: +unique-filename@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" - integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== + 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: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-3.0.0.tgz#728baca4767c0e784e1e64bb44b5a5a753021a04" - integrity sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ== +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: - "@types/unist" "^2.0.0" + 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== + 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-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== + 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-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 "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-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-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@^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" + 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== -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" @@ -14781,18 +14699,10 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -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" @@ -14820,15 +14730,15 @@ unzipper@^0.9.11: readable-stream "~2.3.6" setimmediate "~1.0.4" -upath@^2.0.1: +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.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" - integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -14864,17 +14774,13 @@ url-join@^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 sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== +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" - -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 sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A== + querystringify "^2.1.1" + requires-port "^1.0.0" use-isomorphic-layout-effect@^1.1.2: version "1.1.2" @@ -14893,17 +14799,33 @@ user-home@^2.0.0: dependencies: os-homedir "^1.0.0" +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== + 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 sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +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: + 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 sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^3.2.1, uuid@^3.3.2: +uuid@^3.2.1: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -14918,6 +14840,11 @@ uuid@^8.0.0, uuid@^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: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + uvu@^0.5.0: version "0.5.6" resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" @@ -14928,7 +14855,7 @@ uvu@^0.5.0: kleur "^4.0.3" sade "^1.7.3" -v8-compile-cache@2.3.0, v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: +v8-compile-cache@2.3.0, v8-compile-cache@^2.2.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== @@ -14945,7 +14872,7 @@ valid-filename@^2.0.1: dependencies: filename-reserved-regex "^2.0.0" -validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: +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== @@ -14953,6 +14880,13 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate-npm-package-name@5.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" @@ -14960,39 +14894,32 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -validate-npm-package-name@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" - integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== - dependencies: - builtins "^5.0.0" - vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 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 sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== +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.4" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.4.tgz#bbb8c96b956693bbf70b2c67fdb5781dff769b93" - integrity sha512-KI+7cnst03KbEyN1+JE504zF5bJBZa+J+CrevLeyIMq0aPU681I2rQ5p4PlnQ6exFtWiUrg26QUdFMnAKR6PIw== + 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" @@ -15004,7 +14931,7 @@ vhost@^3.0.2: resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5" 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== @@ -15016,84 +14943,66 @@ vinyl@^2.2.0: remove-trailing-separator "^1.0.1" replace-ext "^1.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-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@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz#cb9989c65e219e18533cc38e767611272d274c94" + integrity sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw== -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.3" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz#6d0d54da093f0c0ee3060b81612cce0f11060d57" + integrity sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA== dependencies: - vscode-jsonrpc "^5.0.1" - vscode-languageserver-types "3.15.1" + vscode-jsonrpc "8.1.0" + vscode-languageserver-types "3.17.3" vscode-languageserver-textdocument@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.5.tgz#838769940ece626176ec5d5a2aa2d0aa69f5095c" - integrity sha512-1ah7zyQjKBudnMiHbZmxz5bYNM9KKZYz+5VQLj+yr8l+9w3g+WAhCkUkWbhMEdC5u0ub4Ndiye/fDyS8ghIKQg== + version "1.0.8" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz#9eae94509cbd945ea44bca8dcfe4bb0c15bb3ac0" + integrity sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q== -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.3: + version "3.17.3" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz#72d05e47b73be93acb84d6e311b5786390f13f64" + integrity sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA== 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-proxy-agent@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/vscode-proxy-agent/-/vscode-proxy-agent-0.11.0.tgz#9dc8d2bb9d448f1e33bb1caef97a741289660f2f" - integrity sha512-Y5mHjDGq/OKOvKG0IwCYfj25cvQ2cLEil8ce8n55IZHRAP9RF3e1sKU4ZUNDB8X2NIpKwyltrWpK9tFFE/kc3g== - dependencies: - "@tootallnate/once" "^1.1.2" - agent-base "^6.0.2" - debug "^4.3.1" - get-uri "^3.0.2" - 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.0" - -vscode-textmate@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-7.0.1.tgz#8118a32b02735dccd14f893b495fa5389ad7de79" - integrity sha512-zQ5U/nuXAAMsh691FtV0wPz89nSkHbs+IQV8FDk+wew9BlSDhf4UmWGlWJfTR2Ti6xZv87Tj5fENzKf6Qk7aLw== +vscode-textmate@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-7.0.4.tgz#a30df59ce573e998e4e2ffbca5ab82d57bc3126f" + integrity sha512-9hJp0xL7HW1Q5OgGe03NACo7yiCTMEk3WU/rtKXUbncLtdg6rVVNJnHwD88UhbIYU2KoxY0Dih0x+kIsmUKn2A== 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-windows-ca-certs@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/vscode-windows-ca-certs/-/vscode-windows-ca-certs-0.3.0.tgz#324e1f8ba842bbf048a39e7c0ee8fe655e9adfcc" - integrity sha512-CYrpCEKmAFQJoZNReOrelNL+VKyebOVRCqL9evrBlVcpWQDliliJgU5RggGS8FPGtQ3jAKLQt9frF0qlxYYPKA== - dependencies: - node-addon-api "^3.0.2" - -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" - -walk-up-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e" - integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== + 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 sha512-1S0lwbHo3kNUKA4VomBAhqn4DPjQkIKSdbOin5K7EFUQNwyIKx+wZMGXKI53RUjla8V2B8ouQduUlgtx8LoSMw== -watchpack@^2.3.1: +watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== @@ -15108,15 +15017,20 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-streams-polyfill@^3.0.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 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" @@ -15138,9 +15052,9 @@ 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.9.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== dependencies: clone-deep "^4.0.1" wildcard "^2.0.0" @@ -15150,22 +15064,22 @@ 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.73.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" - integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== +webpack@^5.76.0: + version "5.88.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.1.tgz#21eba01e81bd5edff1968aea726e2fbfd557d3f8" + integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== 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" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -15174,23 +15088,31 @@ webpack@^5.48.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" 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" @@ -15200,24 +15122,6 @@ whatwg-url@^5.0.0: 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== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -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-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -15230,16 +15134,28 @@ which-boxed-primitive@^1.0.2: is-symbol "^1.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 sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + 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@1.3.1, which@^1.2.8, which@^1.2.9, which@^1.3.1: +which-typed-array@^1.1.10, which-typed-array@^1.1.2: + version "1.1.10" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" + integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +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== @@ -15253,6 +15169,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +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: + 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" @@ -15268,20 +15191,15 @@ 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== -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== - wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -15295,6 +15213,20 @@ worker-loader@^3.0.8: loader-utils "^2.0.0" schema-utils "^3.0.0" +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +"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 "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.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" @@ -15321,20 +15253,28 @@ 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 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.4.2: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" @@ -15344,24 +15284,6 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.4.2: imurmurhash "^0.1.4" signal-exit "^3.0.2" -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write-file-atomic@^4.0.0, write-file-atomic@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - 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" @@ -15386,19 +15308,7 @@ write-json-file@^3.2.0: sort-keys "^2.0.0" write-file-atomic "^2.4.2" -write-json-file@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-4.3.0.tgz#908493d6fd23225344af324016e4ca8f702dd12d" - integrity sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ== - dependencies: - detect-indent "^6.0.0" - graceful-fs "^4.1.15" - is-plain-obj "^2.0.0" - make-dir "^3.0.0" - sort-keys "^4.0.0" - write-file-atomic "^3.0.0" - -write-pkg@^4.0.0: +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== @@ -15407,68 +15317,61 @@ write-pkg@^4.0.0: type-fest "^0.4.1" write-json-file "^3.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" +ws@8.13.0, ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== ws@^7.1.2: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -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.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== -xdg-basedir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" - integrity sha512-NF1pPn594TaRSUO/HARoB4jK8I+rWgcpVlpQCK6/6o5PHyLUt2CSiDrpUZbQ6rROck+W2EwF8mBJcTs+W98J9w== - 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== + +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.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== -xregexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA== - xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -15509,7 +15412,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== -yallist@^3.0.0, 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== @@ -15519,7 +15422,7 @@ 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.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== @@ -15555,11 +15458,6 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.3: 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" @@ -15576,6 +15474,16 @@ yargs-unparser@1.6.0: lodash "^4.17.15" yargs "^13.3.0" +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: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.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" @@ -15592,6 +15500,32 @@ yargs@13.3.2, yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.2" +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 "^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.7.1: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + 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.1.1" + yargs@^11.1.0: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" @@ -15627,36 +15561,10 @@ 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== - dependencies: - cliui "^7.0.2" - 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@^17.6.2: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== +yargs@^17.0.1, yargs@^17.5.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 "^8.0.1" escalade "^3.1.1"